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 是 运行(如果我没记错的话)