2017-10-15 12 views
1

Insérer requêteComment insérer des données et obtenir id comme paramètre out dans android room et rxjava 2?

@Insert(onConflict = OnConflictStrategy.REPLACE) 
long insertProduct(Product product); //product id is auto generated 

vue modèle

public Completable insertProduct(final String productName) { 
    return new CompletableFromAction(() -> { 
     Product newProduct = new Product(); 
     newProduct.setProductName(productName); 
     mProductDataSource.insertOrUpdateProduct(newProduct); 
    }); 
} 

Dans l'activité où j'ai appelé cette fonction ci-dessus je CompositeDisposable.

CompositeDisposable mDisposable = new CompositeDisposable(); 

mDisposable.add(mViewModel.insertProduct(productName)) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(() ->{} ,throwable -> Log.e(TAG, "Error msg", throwable))); 

Est-ce que je mets en œuvre dans le mauvais sens?

Répondre

2

Selon docs. Si la méthode @Insert ne reçoit qu'un seul paramètre, elle peut renvoyer un long, qui correspond au nouveau rowId de l'élément inséré. Si le paramètre est un tableau ou une collection, il doit renvoyer long [] ou List à la place. Étant donné que vous insérez un seul élément, la méthode retourne un seul rowID.

, essayez cette

Single.fromCallable(new Callable<Long>() { 
     @Override 
     public Long call() throws Exception { 
      return productDao.insertProduct(new Product())); 
     } 
    }) 
    .subscribe(id -> { 

    } ,throwable -> Log.e(TAG, "Error msg", throwable))) 

Vous pouvez utiliser Observable ou Maybe aussi bien. Mais je pense que Single convient mieux puisque dans votre cas, l'identifiant est généré automatiquement et l'insertion doit toujours être terminée.

+0

Ici, j'utilise android vue modèle où je fais face à des difficultés sur la façon d'écrire la fonction viewmodel. J'ai donné le code où j'utilise Completable pour insérer le produit. –

+0

En tant que votre suggestion que je usage unique 'publique unique insertProduct (dernière chaîne productName) {return new simple () { @Override protégé subscribeActual vide (SingleObserver observateur) { Produit newproduct = nouveau produit() newProduct.setProductName (productName); productDataSource.insertOrUpdateProduct (nouveauProduit); } }; } 'mais ce n'est pas le travail, peut-être me manque quelque chose. –

+0

Je pense que vous devez vérifier les [docs] (https://github.com/ReactiveX/RxJava/wiki/Creating-Observables) sur la façon de créer un «Observable». – masp