首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android Room的@Insert上返回Single<Long>不起作用

是因为Room的@Insert注解默认情况下返回的是一个long类型的值,表示插入操作影响的行数。如果想要返回插入的行的主键值,可以使用@Insert注解的onConflict参数来指定冲突策略,并使用@Insert注解的返回类型为long[]或List<Long>。

具体来说,可以按照以下步骤进行操作:

  1. 在定义Dao接口的地方,将@Insert注解的返回类型改为long[]或List<Long>,如下所示:
代码语言:txt
复制
@Insert(onConflict = OnConflictStrategy.REPLACE)
List<Long> insertData(Data... data);
  1. 在调用插入操作的地方,使用Single.fromCallable()方法将插入操作包装成一个Single对象,并在call()方法中返回插入的行的主键值,如下所示:
代码语言:txt
复制
Single<List<Long>> insertSingle = Single.fromCallable(() -> {
    // 执行插入操作
    return dao.insertData(data);
});
  1. 在订阅Single对象的地方,使用subscribeOn()方法指定在后台线程执行插入操作,并使用observeOn()方法指定在主线程接收结果,如下所示:
代码语言:txt
复制
insertSingle
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new SingleObserver<List<Long>>() {
        @Override
        public void onSubscribe(Disposable d) {
            // 订阅成功
        }

        @Override
        public void onSuccess(List<Long> ids) {
            // 插入成功,ids为插入的行的主键值
        }

        @Override
        public void onError(Throwable e) {
            // 插入失败
        }
    });

这样,就可以通过返回Single<List<Long>>来获取插入的行的主键值了。

关于Android Room的更多信息和使用方法,可以参考腾讯云的文档:Android Room

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的结果

领券