首页
学习
活动
专区
工具
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

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

相关·内容

Android 架构组件的最新进展 (下篇)

根据我们曾经做的调查,开发者们希望 Android 官方可以维护一些实用的组件库和架构实践,以降低中大型应用的开发门槛,这样开发团队就可以集中更多精力在实际业务的优化和改进上。...是一个在 SQLite 上提供抽象层的持久存储库,您可以回顾我们之前的介绍文章了解更多 Room 的详细信息。...Rx 支持 在 Room 2.1 中,您使用的 insert, update, delete 方法能返回 Completable, Maybe 和 Single。...而且在 Query 注解的方法里可以使用 Rx 作为返回类型,并处理 update, insert 或者 delete 这样的写入操作: @Insert fun addSong(song: Song...复制代码 Google Play services 集成 此功能即将到来,而且提升了在 Marshmallow 之前版本的设备上的运行性能。而且这个集成是可选的,开发者可以根据需要自行选择是否集成。

83920

room的使用-以demo为例

" //数据库迁移的时候使用 compile "android.arch.persistence.room:testing:1.0.0-alpha5" 在项目的build.gradle...) void insertAll(List students); //如果@Insert方法只接收一个参数,它可以返回一个long,代表新插入元素的rowId...@Insert long insert(Student student); //可以返回一个int类型的值,表示从数据库中被删除的行数,虽然通常并没有这个必要 @Delete...查询的结果如果是long类型,可以直接返回Date。 数据库的迁移 随着app功能的添加和修改,你需要修改entity类来反应这些变化。...这样就可以直观的看到数据库有没有更改成功~ 从原生sqlite到room的迁移 和room不同版本的迁移没什么区别,毕竟本质上都是对sqlite的操作,但是同样要注意版本号的问题。

2.3K30
  • MVVM的数据持久化(一)——ROOM的集成

    简介地址 https://developer.android.google.cn/training/data-storage/room/ Room在SQLite上提供了一个抽象层,以便在发挥SQLite...用@Database注解的类应满足以下条件: 是一个继承RoomDatabase的抽象类。 在注释中包含与数据库相关联的实体列表。 包含一个具有0个参数的抽象方法,并返回用@Dao注释的类。...三者关系图 加入依赖 以上简单的介绍了一下Room 下面我们着重介绍如何在我们的框架当中使用 首先加入依赖 implementation 'android.arch.persistence.room...要为一个entity添加索引,在@Entity注解中添加indices属性,列出你想放在索引或者组合索引中的字段。 有时候,某个字段或者几个字段必须是唯一的。...package yang.cehome.com.mvvmdemo.model.local.dao import android.arch.persistence.room.Dao import android.arch.persistence.room.Insert

    1.5K20

    Android Room 持久化库

    public void insertUsersAndFriends(User user, List friends); } 如果 @Insert 只接受到一个参数,他会返回一个新插入行的 long...如果参数是 一个数组和集合就会返回一个long类型的数组或集合。...关于 @Insert 的详细介绍查看文档 https://developer.android.com/reference/android/arch/persistence/room/Insert.html...测试数据库有两种方法 在Android 设备上 在开发主机上(不推荐) 关于测试指定数据库升级的信息 上面已经说过了。 注意:在测试时,Room允许创建Dao的模拟实例。...这样的话,如果不是测试数据库本身就不需要创建完整的数据库,这个功能是很好的,Dao不会泄露数据库的任何信息 在设备上测试 测试数据库实现的推荐方法是编写在Android设备上运行的JUnit测试,由于这些测试不需要创建活动

    4K70

    Android的room数据库使用小结(kotlin)

    首先准备,引入依赖,在app文件夹下的build.gradle中增加: //ROOM数据库 implementation "android.arch.persistence.room:runtime..."android.arch.persistence.room:compiler:1.1.1"的写法需换成kapt "android.arch.persistence.room:compiler:1.1.1..." 还需引入一个插件:apply plugin: 'kotlin-kapt' 代码结构目录是不是很清晰,在room下dao的单独建dao包,操作接口在这里实现,所有的表定义单独在entity包中。...= null } 第二步,在dao包里写对应的dao,对应的操作, 注意这些操作接口最好都带个返回值,比如insert返回long,delete返回Int。因为最终的使用总要对操作结果来个判断吧。...@Insert fun insert(user: User?):Long @Delete fun delete(vararg users: User?)

    3.3K50

    【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

    使用 @Database 注解修饰该类 , 其中定义 获取 Dao 数据库访问对象的抽象方法 , 以及 将该抽象类设置成 单例类 , 在单例对象初始化时创建数据库 ; 在 Room 框架中的 Dao...将 Room 封装起来 , 由 ViewModel 与 Repository 进行交互 ; ViewModel 与 Room 结合使用 , 实际上与 Repository 进行交互 ; ViewModel...框架主动查询数据库数据需保留除 LiveData 返回值外的正常查询方法 Room 框架 与 LiveData 结合使用之后 , 在 Room 框架中的 Dao 数据库访问接口中 定义了 LiveData...Room 框架中的 Dao 数据库访问对象接口 的定义方式需要作出改变 , 涉及到数据库查询的 接口方法时 , 其返回值需要 返回 LiveData 类型 , 泛型设置为 List 类型...原则上不允许在主线程操作数据库 // 如果要在主线程操作数据库需要调用该函数

    1K20

    上手使用 Room Kotlin API

    developer.android.google.cn/codelabs/android-room-with-a-view-kotlin#0 定义数据库表 在我们的数据库中仅有一个表,就是保存词汇的表。...@Insert suspend fun insert(word: Word) 在底层 Room 生成了 Dao 抽象函数的实现代码。...我们希望当数据库中的数据发生改变的时候,能够得到相应的通知,所以我们返回一个 Flow>。由于返回类型是 Flow,Room 会在后台线程中执行数据请求。...instance } } } 测试 Dao 为了测试 Dao,我们需要实现 AndroidJUnit 测试来让 Room 在设备上创建 SQLite 数据库。...当实现 Dao 测试的时候,在每个测试运行之前,我们创建数据库。当每个测试运行后,我们关闭数据库。由于我们并不需要在设备上存储数据,当创建数据库的时候,我们可以使用内存数据库。

    1.6K10

    Android Jetpack - Room

    Room 简介 Room 持久化库提供了一个基于 SQLite 的抽象层,以便在利用 SQLite 的全部功能的同时实现更强大的数据库访问 Room 库帮你的 App 在设备上创建一个缓存,并作为此 App...然后,在设备重新联机后,任何用户启动的内容更改都会同步到服务器 Room 的三个主要部分包括 Database 包含数据库持有者,并作为应用程序的持久关系数据的基础连接的主要访问点。...使用@Database注释的类应满足以下条件: 继承了 RoomDatabase 的抽象类 在注解中包含与数据库相关联的实体类列表 包含一个无参抽象方法,并返回使用 @Dao 注释的类。...Entity 在 Room 中,每个被 @Entity 标注的 data class 都被视为 Database 中的一张表 @Entity(tableName = "word_table") data...insert ,可以使用 suspend 关键字修饰,然后利用协程在非 UI 线程执行此方法 @Dao interface WordDao { @Insert suspend fun

    1.9K70

    JetPack--Room数据库

    JetPack提供了Room数据库,和GreenDAO等开源库一样,在SQLite做了封装 Room主要使用三个注解: 1.Entity:实体类,对应一张表 2.Dao:包含操作表的一些列方法 3.Database...需要满足:定义的类是一个继承RoomDatabase的抽象类,注解中定义包含实体类列表,包含一个没有参数的抽象方法并返回Dao对象 一、Room上手 首先添加依赖: implementation...' 定义一个实体类,在class上使用 @Entity注解 ,还需要一个构造方法,Room会根据这个构造将表里的数据转化为实体类,对于其他我们代码里使用的构造方法,可以使用@Ignore注解表示Room...、数据库版本、是否输出日志 使用单例模式时,构造方法不能私有化,因为Room内部会调用构造方法 定义获取Dao对象的抽象函数 package com.aruba.room; import android.content.Context...二、ViewModel+LiveData+Room Room支持返回LiveData类型,结合ViewModel、DataBinding,就可以改造成一个非常棒的MVVM架构 package com.aruba.room

    1.5K20

    Google 推荐在 MVVM 架构中使用 Kotlin Flow

    Fragment 1.2.0 上重要的更新:通过 Fragment 的构造函数传递参数,以及 FragmentFactory 和 FragmentContainerView 的使用 我近期也在开发另外一个...,实际上在项目中常用的可能只有几个例如 Observable 、 Flowable 、 Single 等等,如果我们不去了解背后的原理,造成内存泄露是很正常的事,大家可以从 StackOverflow...Flow 是协程的扩展,如果要在 Room 和 Retrofit 中使用,Room 和 Retrofit 需要支持协程才可以,在 Retrofit >= 2.6.0 和 Room >= 2.1 版本都支持协程...按照如上配置,在数据源的工作就完成了,相比于 RxJava 的 Observable 、 Flowable 、 Single 、 Completable 、 Maybe 使用场景要简单太多了,我们来看一下在...).observe(this, Observer { // 将数据显示在页面上 }) 方式三: 调用 Flow 的扩展方法 asLiveData() 返回一个不可变的 LiveData,在 Activity

    4.4K21

    Jetpack---Paging你知道怎样上拉加载吗?

    背景 在我的Jetpack_Note系列中,对每一篇的分析都有相对应的代码片段及使用,我把它做成了一个APP,目前功能还不完善,代码我也上传到了GitHub上,参考了官方的Demo以及目前网上的一些文章...Paging库中提供了三个子类来让我们在不同场景的情况下使用: PageKeyedDataSource:如果后端API返回数据是分页之后的,可以使用它;例如:官方Demo中GitHub API中的SearchRespositories...就可以返回分页数据,我们在GitHub API的请求中制定查询关键字和想要的哪一页,同时也可以指明每个页面的项数。...loadAfter同理,只不过我们在加载数据后对key也就是我们的page进行了+1操作。...到这里整个流程就已经结束了,想看源码可以到Github上。 4.

    1.8K40

    Android 架构组件 - 让天下没有难做的 App

    其中 Architecture 部分的组件(Android Architecture Components,以下简称 AAC)组合起来形成了一套完整的架构解决方案,在没有更好的方案被发明出来之前,我们姑且把...Github 上出现了不少 ORM 框架,但是它们的易用性也不敢让人恭维,直到 Room 出来之后,Android 程序员终于可以像 mybatis 那样轻松地操纵数据库了。...Room 是 SQLite 之上的应用抽象层,而 SQLite 是一个位于 Android Framework 层的内存型数据库。...fun timestampToDate(value: Long?)...,而且它的返回值可以是 LiveData 类型,也支持 Flowable 类型,也就是说,Room 原生支持响应式,这是对数据驱动最有利的支持,也是 Room 区别于其他 ORM 框架的显著特征。

    1.2K20

    livedatabus详解,阿里是如何用他来做淘宝架构的?

    其中 Architecture 部分的组件(Android Architecture Components,以下简称 AAC)组合起来形成了一套完整的架构解决方案,在没有更好的方案被发明出来之前,我们姑且把...Github 上出现了不少 ORM 框架,但是它们的易用性也不敢让人恭维,直到 Room 出来之后,Android 程序员终于可以像 mybatis 那样轻松地操纵数据库了。...Room 是 SQLite 之上的应用抽象层,而 SQLite 是一个位于 Android Framework 层的内存型数据库。...fun timestampToDate(value: Long?)...,而且它的返回值可以是LiveData类型,也支持Flowable类型,也就是说,Room 原生支持响应式,这是对数据驱动最有利的支持,也是 Room 区别于其他 ORM 框架的显著特征。

    1.2K30

    Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用

    ③ 加载网络数据 之前在initData中进行数据请求的返回处理,拿到了返回值,如下图所示: 这里层层传值到BodyContent函数中,在这个函数中我们就来显示数据,函数的代码如下: @Composable...五、Room使用   现在数据有了,那么为了减少接口API的访问次数,我们需要将数据存储到本地数据库中,我们可以在每天访问两次或一次接口,然后其余的访问都从数据库中去获取数据。这样是不是很好呢?...这就是说当我的数据库中有数据了,那么就从本地数据库中去获取数据显示在UI上,运行一下: 你会发现报错了,报错的原因就是我标注的这里,大意就是无法在主线程中访问数据库,那么也好解决,在Room上加一个配置就可以了...本地缓存,在Android中提到缓存,你最开始想到的就是SP(SharedPreferences),然后是腾讯的MMKV,再是DataStore,这三者是先后顺序出现的,也许你还不知道DataStore...当然了你不了解可以去看看Android Jetpack组件 DataStore的使用和简单封装,看完了你就知道怎么用了,当然你也可以不用看,因为实际上我们的用法和SP差不多,都是封装成工具类来使用,在那篇文章中就是这样封装

    3.2K31

    Android Architecture Components Part1:Room

    在Android App中进行本地数据的存储都是使用SQLite,当我们使用原生的SQLite进行本地数据库的编写时,我们不仅要定义数据库结构,还要创建SQLiteHelper,编写一连串的SQL语句。...Entity Entity作用在model上,即我们与数据表中的字段所匹配的model类。...要注意它必须为interface,在接口中我们只需定义接口方法即可。与平常的接口方法定义不同的是,我们必须在每一个接口方法上通过注释来标明该方法的作用。...在ContactsDataBase中还需定义一个抽象方法,让它返回由@Dao注释的ContactsDao,即提供获取数据表的方法。本质的为数据库暴露操作数据表的入口。...在第二行代码,细心的你们可能会发现它返回了LiveData类型数据。它是ACC的另一强大组件,这也是Room的另一强大之处,它可以直接返回LiveData数据类型,完美与LiveData结合。

    79920
    领券