如何在android room和rxjava 2中插入数据并获取id作为out参数?

时间:2017-10-15 11:10:30

标签: rx-java2 android-room

插入查询

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

查看模型

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

在我调用上面这个函数的活动中,我使用了CompositeDisposable。

CompositeDisposable mDisposable = new CompositeDisposable();

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

我是以错误的方式实施的吗?

1 个答案:

答案 0 :(得分:4)

根据setTimeout。如果@Insert方法只接收1个参数,则它可以返回long,这是插入项的新rowId。如果参数是数组或集合,则应返回long []或List。 由于您只插入一个项目,因此该方法只返回一个rowID。

所以,试试这个

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)))

您也可以使用ObservableMaybe。但我认为Single更合适,因为在你的情况下,id是自动生成的,插入应该总是完成。