Android ROOM LIVEDATA 未发出结果
Android ROOM LIVEDATA not emitting the results
您好,我有一个从数据源中检索到的项目列表,然后我在可观察对象上应用了一个映射以将数据存储到 ROOM 中。
它设法将它添加到 table 但是当我尝试检索它的 LiveData 时,它似乎没有将结果通知我的观察者。
table 中肯定有数据,我的查询工作正常,因为我将 return 时间从 LiveData 更改为简单的列表并且工作得很好
这是我的数据class
@Entity
data class Item(
@PrimaryKey
val id:String,
val title: String,
val description: String,
val imgUrl: String,
val usageRules : List<String>,
)
这是我的 DAO,它公开了一个添加所有项目列表的函数
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun saveAllItems(itemList: MutableList<Item>)
@Query("SELECT * FROM items")
fun getAllItems(): LiveData<MutableList<Item>>
}
我的数据库class
@Database(entities = arrayOf(Item::class), version = 1, exportSchema = false)
@TypeConverters(UsageRulesTypeConverter::class)
abstract class MyDatabase : RoomDatabase() {
abstract fun getProductDao(): MyDao
}
下面是我如何将数据插入数据库:
@Inject
lateInt val database : MyDatabase
override fun getAllItems(): Single<LiveData<MutableList<Item>>> {
//retrieve new data using rertrofit
networkController.getItems().map { responseItems ->
saveAllItems(responseItems )
getItems()
}
@Transaction
fun saveAllItems(allItems: ItemsDataSource) {
database.getProductDao().saveAllItems(allItems.loadedItems)
database.getProductDao().saveAllItems(allItems.savedItems)
database.getProductDao().saveAllItems(allItems.expiredItems)
database.getProductDao().saveAllItems(allItems.unloadedItems)
}
fun getItems() : LiveData<MutableList<Item>>{
return database.getProductDao().getAllItems()
}
我的数据源检索到 4 个项目列表,然后我将它们全部保存在一个列表中 entity/table 但是 LiveData 没有通知我的 UI 吗?
视图模型:
override fun getUnloadedOffers(): LiveData<MutableList<ProductOffer>> {
if (!this::itemsLiveData.isInitialized) {
itemsLiveData= MutableLiveData()
//get data from network or database
itemDelegator.getItems()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ items->
itemsLiveData= items
})
}
return itemsLiveData
}
UI
viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
viewModel.getItems().observe(this, Observer {
items->
items?.let {
adapter = SomeAdapter(items)
itemsRecyclerView.adapter = adapter
adapter.notifyDataSetChanged()
}
})
保存数据集时尽量使用vararg
而不是List
。
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun saveAllItems(vararg itemList: Item)
然后您可以使用列表中的 *
(也称为 Spread Operator
)调用此方法,如下所示
saveAllItems(*responseItems.toTypedArray())
你的函数 getUnloadedOffers()
return 是否为空 mutableList?我不确定将 items
传递给 itemsLiveData
是否有效,因为在 bg 线程上观察 LiveData 是 运行(如果我没记错的话)
您好,我有一个从数据源中检索到的项目列表,然后我在可观察对象上应用了一个映射以将数据存储到 ROOM 中。
它设法将它添加到 table 但是当我尝试检索它的 LiveData 时,它似乎没有将结果通知我的观察者。
table 中肯定有数据,我的查询工作正常,因为我将 return 时间从 LiveData 更改为简单的列表并且工作得很好
这是我的数据class
@Entity
data class Item(
@PrimaryKey
val id:String,
val title: String,
val description: String,
val imgUrl: String,
val usageRules : List<String>,
)
这是我的 DAO,它公开了一个添加所有项目列表的函数
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun saveAllItems(itemList: MutableList<Item>)
@Query("SELECT * FROM items")
fun getAllItems(): LiveData<MutableList<Item>>
}
我的数据库class
@Database(entities = arrayOf(Item::class), version = 1, exportSchema = false)
@TypeConverters(UsageRulesTypeConverter::class)
abstract class MyDatabase : RoomDatabase() {
abstract fun getProductDao(): MyDao
}
下面是我如何将数据插入数据库:
@Inject
lateInt val database : MyDatabase
override fun getAllItems(): Single<LiveData<MutableList<Item>>> {
//retrieve new data using rertrofit
networkController.getItems().map { responseItems ->
saveAllItems(responseItems )
getItems()
}
@Transaction
fun saveAllItems(allItems: ItemsDataSource) {
database.getProductDao().saveAllItems(allItems.loadedItems)
database.getProductDao().saveAllItems(allItems.savedItems)
database.getProductDao().saveAllItems(allItems.expiredItems)
database.getProductDao().saveAllItems(allItems.unloadedItems)
}
fun getItems() : LiveData<MutableList<Item>>{
return database.getProductDao().getAllItems()
}
我的数据源检索到 4 个项目列表,然后我将它们全部保存在一个列表中 entity/table 但是 LiveData 没有通知我的 UI 吗?
视图模型:
override fun getUnloadedOffers(): LiveData<MutableList<ProductOffer>> {
if (!this::itemsLiveData.isInitialized) {
itemsLiveData= MutableLiveData()
//get data from network or database
itemDelegator.getItems()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ items->
itemsLiveData= items
})
}
return itemsLiveData
}
UI
viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
viewModel.getItems().observe(this, Observer {
items->
items?.let {
adapter = SomeAdapter(items)
itemsRecyclerView.adapter = adapter
adapter.notifyDataSetChanged()
}
})
保存数据集时尽量使用vararg
而不是List
。
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun saveAllItems(vararg itemList: Item)
然后您可以使用列表中的 *
(也称为 Spread Operator
)调用此方法,如下所示
saveAllItems(*responseItems.toTypedArray())
你的函数 getUnloadedOffers()
return 是否为空 mutableList?我不确定将 items
传递给 itemsLiveData
是否有效,因为在 bg 线程上观察 LiveData 是 运行(如果我没记错的话)