当前位置: 首页 > 知识库问答 >
问题:

Android ROOM LIVEDATA不发布结果

巫马浩言
2023-03-14

嗨,我有一个项目的列表,我从数据源中检索,然后我在可观察的地图上应用,将数据存储到ROOM。

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

有明确的数据在表中,我的查询工作,因为我改变了返回时间从LiveData到简单的列表,这工作得很好

这是我的数据类

@Entity
data class Item(
        @PrimaryKey
        val id:String,
        val title: String,
        val description: String,
        val imgUrl: String,
        val  usageRules : List<String>,

)

这是我的DAO,它公开了一个func,可以添加所有项目列表

@Dao
interface MyDao {

@Insert(onConflict = OnConflictStrategy.IGNORE)
    fun saveAllItems(itemList: MutableList<Item>)

       @Query("SELECT * FROM items")
    fun getAllItems(): LiveData<MutableList<Item>>

}

我的DB类

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

            })

共有2个答案

胡越
2023-03-14

保存数据收集时,尝试使用vararg而不是List

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

然后,您可以使用列表中的*(也称为扩展运算符)调用此方法,如下所示

saveAllItems(*responseItems.toTypedArray())
公良信然
2023-03-14

函数getUnloadedOffers()是否返回空的可变列表?我不确定将items传递到itemslvedata是否有效,因为观察LiveData是在bg线程上运行的(如果我没弄错的话)

 类似资料:
  • 我在运行Jenkins 1.571。我正在使用构建我的项目。我有两次执行以分叉模式执行两个testng套件。 生成日志显示: 我的相关pom.xml:

  • 问题内容: 我敢肯定这很简单,但我是JQuery的新手。我正在使用JQuery插件验证电子邮件地址,此方法有效,代码为: 然后,我想做的是使用ajax帖子发布电子邮件地址,同样,此代码在没有验证程序的情况下也可以正常工作: 我似乎无法做的是将两者结合在一起,这样,如果电子邮件有效,它将随后发布。非常感谢您提供帮助。 非常感谢 问题答案: 可以通过传入具有各种配置选项的对象来进行配置。在这种情况下,

  • 我有一个发布管道,它结合了两个构建管道工件来创建完整的版本。完成后,我需要能够下载此任务的结果。 我运行存档任务来压缩结果,但我不知道如何将其保存到可以使用Azure Pipeline代理下载的位置。 有没有可以触发下载的任务,或者我可以将其保存为神器? 谢谢

  • 我对pact还是一个新手,我正在尝试使用pact,但是我遇到了一个问题,无法从Pact-Verify发回提供程序的测试结果。 “sbt”pact-verify--host localhost--port 8081“”结果: [...]正在尝试从pact broker获取pact,网址为:http://localhost:8080/pacts/provider/provider/consumer/c

  • 我正在尝试设置CI / CD,但没有太多的运气。我的目标是通过 构建一个 .net 网络项目,并将其部署到 应用程序。 我现在在哪里? 创建了< code>vsts-ci.yml文件,如下所示: 我有一个构建定义,如下所示: 有了这个,我的第一步运行正确。顺便说一下代理池是。 然后,我创建了一个如下发布管道: 作为第1阶段的任务(在工件步骤之后运行的部分),我有以下内容: 我已经将构建与主分支提交

  • 问题内容: 我有一个似乎无法满足的简单要求:我有一个产品页面。产品具有供应商,供应商输入是带有自动完成功能的文本字段。如果用户输入数据库中不存在的供应商,则需要添加它。要添加它,我在.load()页面上有一个DIV并调用了我的/ Vendor / Create控制器方法。该方法的视图使用: 这应该通过ajax发布我的表单,完成后调用Javascript。我遇到的问题是,提交后,我的整个页面都会刷新