【问题标题】:Android ROOM LIVEDATA not emitting the resultsAndroid ROOM LIVEDATA 未发出结果
【发布时间】:2018-02-21 17:21:32
【问题描述】:

您好,我有一个从数据源检索的项目列表,然后我在可观察对象上应用映射以将数据存储到 ROOM。

它设法将它添加到表中,但是当我尝试检索它的 LiveData 时,它似乎没有通知我的观察者结果。

表中有明确的数据,当我将返回时间从 LiveData 更改为简单的 List 时,我的查询工作正常,而且效果很好

这是我的数据类

@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>>

}

我的数据库类

@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 个项目列表,然后我将它们全部保存在一个实体/表中,但 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
    }

用户界面

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()
                }

            })

【问题讨论】:

    标签: android sql kotlin rx-java android-room


    【解决方案1】:

    你的函数 getUnloadedOffers() 返回空的 mutableList 吗?我不确定将 items 传递给 itemsLiveData 是否会起作用,因为观察 LiveData 正在 bg 线程上运行(如果我没记错的话)

    【讨论】:

    • 是的,这就是问题所在。我必须首先从 sql room 查询中获取实时数据本身,然后通过我的委托人将其传递回视图模型
    • 确实如此,通常你应该从 Room 中选择 LiveData,将其传递给 ViewModel 并在你的 Activity/Fragment 或任何你需要的地方订阅它?
    【解决方案2】:

    在保存数据集合时尝试使用vararg 而不是List

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun saveAllItems(vararg itemList: Item)
    

    然后您可以像这样使用列表中的*(也称为Spread Operator)调用此方法

    saveAllItems(*responseItems.toTypedArray())
    

    【讨论】:

    • 我不确定列表,但在官方的 Room 教程中,他们使用可变参数,所以应该可以。 developer.android.com/training/data-storage/room/index.html
    • 房间接受对象数组而不是 @Insert 的列表,Spread Operator 对我来说效果很好。
    • 似乎没用。奇怪的是房间没有吐出任何插入错误,所以很难调试
    • 好的,它确实插入了数据,但我遇到了另一个问题。也就是说,LiveData 似乎没有更新并从数据库发出查询。我将更新我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2021-04-13
    相关资源
    最近更新 更多