Tag: android room

在房间中更改Flowable <List <Obj1 >>为Flowable <List <Obj2 >>

我怎样才能从房间里读取一个流动的值列表,并将其转换为另一个对象,这个对象是来自房间的更多值的组合 database.leadsDao().getLeads(leadState.name) .flatMap { val len = it.size.toLong() Flowable.fromIterable(it) .flatMap { Flowable.zip( database.orderDao().getById(it.orderId), database.orderMedicineDao().getByOrderId(it.orderId), database.patientDao().getById(it.patientId), Function3<Order, List<OrderMedicine>, Patient, LeadDetail> { order, orderMedicines, patient -> LeadDetail.from(it, patient, order, orderMedicines) }) } .take(len) .toList() .toFlowable() } 上面的代码工作,但我不喜欢take(len)部分。 没有它,流不会呼叫用户的下一个。 流持续等待更多的项目,这不应该发生,因为Flowable.fromIterable给有限的数量或项目,然后结束。 即,下面的代码不起作用 database.leadsDao().getLeads(leadState.name) .flatMap { Flowable.fromIterable(it) .flatMap { Flowable.zip( database.orderDao().getById(it.orderId), database.orderMedicineDao().getByOrderId(it.orderId), database.patientDao().getById(it.patientId), Function3<Order, List<OrderMedicine>, Patient, LeadDetail> { order, orderMedicines, […]

测试RxJava2流动查询室

我一直在为我的房间数据库编写单元测试,在过去,当我有查询返回一个列表,并创建一个允许主线程查询的数据库,但现在我试图用RxJava值我没有运气。 这是我的DAO代码: @Dao interface AccountDAO { @Query("SELECT * FROM account") fun getAll(): Flowable<List<Account>> @Insert fun insert(accounts: List<Account>): List<Long> //… } 这里是我的数据库测试代码,我已经尝试了几件事情来通过它: @RunWith(AndroidJUnit4::class) class CCDatabaseTest { //… @JvmField @Rule val mainActivity = ActivityTestRule<MainActivity>(MainActivity::class.java) @Before fun setUp() { val context = mainActivity.activity database = Room.inMemoryDatabaseBuilder(context, CCDatabase::class.java).allowMainThreadQueries().build() accountDao = database.accountDao() transactionDao = database.transactionDao() } //… @Test fun testWriteReadAccount() […]

使用RxJava的Android室处理空的查询结果

尝试使用RxJava适配器测试新的Android Room Librarty。 我想处理结果,如果我的查询从DB返回0对象: 所以这里是DAO方法: @Query("SELECT * FROM auth_info") fun getAuthInfo(): Flowable<AuthResponse> 而我如何处理它: database.authDao().getAuthInfo() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .switchIfEmpty { Log.d(TAG, "IS EMPTY") } .firstOrError() .subscribe( { authResponse -> Log.d(TAG, authResponse.token) }, { error -> Log.d(TAG, error.message) }) 我的数据库是空的,所以我期望.switchIfEmty()工作,但没有任何处理方法正在发射。 .subscribe()和.switchIfEmpty()

我怎样才能代表与Android室的多对多关系?

我怎样才能代表与房间的多对多关系? 例如我有“客人”和“保留”。 预订可以有许多客人和一位客人可以成为许多预订的一部分。 这是我的实体定义: @Entity data class Reservation( @PrimaryKey val id: Long, val table: String, val guests: List<Guest> ) @Entity data class Guest( @PrimaryKey val id: Long, val name: String, val email: String ) 在查看文档时,我遇到了@Relation 。 我发现它真的很混乱。 根据这个我想创建一个POJO并在那里添加关系。 所以,以我的例子,我做了以下 data class ReservationForGuest( @Embedded val reservation: Reservation, @Relation( parentColumn = "reservation.id", entityColumn = "id", entity = […]

使用房间数据库(房间持久性库)创建触发器

如何使用房间持久性库“ 创建触发器 ” CREATE TRIGGER IF NOT EXISTS delete_till_10 INSERT ON user WHEN (select count(*) from user)>9 BEGIN DELETE FROM user WHERE id IN (SELECT id FROM user ORDER BY id limit (select count(*) -9 from user)); END

在使用Dagger,Room和LiveData时调试DataBinding错误

在我的Android项目中,我使用Android Studio 3.0-beta6,restofit2进行其余调用,Room进行持久化,LiveData进行反应式编程,使用RxJava / RxAndroid。 有几个注释处理器在使用中: android.arch.lifecycle:编译 android.arch.persistence.room:compiler com.google.dagger:匕首编译 com.google.dagger:匕首机器人处理器 org.projectlombok:龙目岛 每当我添加一个新的Retrofit2服务,使用Room注解来模拟类,Room Dao类时,我发现我遇到了一个数据绑定代错误: Error:(3, 27) error: cannot find symbol class DataBindingComponent 一个巨大的“找不到符号”错误的列表已被排除,但我的问题的根本原因往往不是放射。 调试根本原因需要很长时间,因为错误报告似乎非常弱。 在被烧了几次之后,在这种情况下,我使用了一些策略来隔离问题: 搁置我的更改,并以小增量引入更改,并在吹走我的应用程序的构建和模式输出文件夹后,执行干净的重建。 通常这意味着首先引入模型类的变化。 接下来介绍房间需要的Jackson转换器,以便在房间实体模型类中保留非原始类型。 最后介绍了Dao类和Room数据库子类。 检查实体类以确保它们具有@PrimaryKey,@Entity,@TypeConverters Room注释。 确保TypeConverter类指定了转换器类FooConverter,而不是正在转换的类Foo 检查Dao类以确保@Query注释中的tablename中没有复制粘贴错误 但是,有时候我仍然遇到数据生成错误,根本原因是未知的。 我想知道是否有任何好的技术来隔离这个问题的根本原因。 是否有方法打开注释处理器(特别是Room)中的调试日志记录。 TIA对此有任何指导。 我怀疑很多人都面临这种情况。

单元测试室和LiveData

我目前正在开发一个应用程序使用新的Android架构组件 。 具体来说,我正在实现一个房间数据库,在其中一个查询返回一个LiveData对象。 插入和查询按预期工作,但我有一个问题,使用单元测试测试查询方法。 这是我试图测试的DAO: NotificationDao.kt @Dao interface NotificationDao { @Insert fun insertNotifications(vararg notifications: Notification): List<Long> @Query("SELECT * FROM notifications") fun getNotifications(): LiveData<List<Notification>> } 正如你所看到的,查询函数返回一个LiveData对象,如果我改变这只是一个List , Cursor或基本上无论如何我得到预期的结果,这是数据库中插入的数据。 问题是,以下测试总是失败,因为LiveData对象的值始终为null : NotificationDaoTest.kt lateinit var db: SosafeDatabase lateinit var notificationDao: NotificationDao @Before fun setUp() { val context = InstrumentationRegistry.getTargetContext() db = Room.inMemoryDatabaseBuilder(context, SosafeDatabase::class.java).build() notificationDao = db.notificationDao() } @After […]

Android室 – 简单的选择查询 – 无法访问主线程上的数据库

我正在试用Room Persistence Library的示例。 我创建了一个实体: @Entity public class Agent { @PrimaryKey public String guid; public String name; public String email; public String password; public String phone; public String licence; } 创建一个DAO类: @Dao public interface AgentDao { @Query("SELECT COUNT(*) FROM Agent where email = :email OR phone = :phone OR licence = :licence") int agentsCount(String email, String […]

在Room数据库库中将Enum作为主键时出错

我正在使用一个枚举成为与数据库的TypeConvertor的主键和它dos't运行时编译并抛出一个错误 这是我的转换器 class QuranIndexConverter { @TypeConverter fun toQuranIndex(index: String): QuranIndex { return QuranIndex.valueOf(index) } @TypeConverter fun toStringIndex(quranIndex: QuranIndex): String { return quranIndex.name }} 这里是道 @Dao interface SuraDao { @Query("SELECT * FROM " + Constants.TABLE_NAME) fun getAll(): LiveData<List<Sura>> @Insert fun insertAll(suras: List<Sura>) @Insert fun insert(sura: Sura) @Delete fun deleteAll(suras: List<Sura>) @Delete fun delete(sura: Sura)} 这是模块 @Entity(tableName […]

Android室查询数据库更改

我正在使用最新的Room Persistance Library编写应用程序。 该应用程序讽刺地显示项目列表,并更新此列表随着数据的变化。 当新项目被插入到表格中或者更新时,我希望列表能够自动更新。 我到目前为止尝试了香草LiveData和LiveData 。 声明都支持这个功能,正如在文档和博客中所述: https : //medium.com/google-developers/room-rxjava-acb0cd4f3757 以下是Kotlin中的ViewModel片段: messagesFlowable = db.messagesDao().all() messagesFlowable .observeOn(AndroidSchedulers.mainThread()) .subscribe { Log.d(TAG, "Received 1 list of %s items", it.size) messages.value = it } 别的地方,数据库是这样修改的: mDb.messagesDao().add(Message("Some data")) 更新不会推送给观察员。 我想我错过了什么,但是什么? 更新:此问题已解决,答案如下。