【问题标题】:Room get id from execute method房间从执行方法中获取 id
【发布时间】:2018-09-19 11:53:39
【问题描述】:

我有一个带有 RecyclerView 和 FloatingActionButton 的片段。按 fab 会打开一个对话框,其中包含新项目的设置。通过单击肯定按钮,我将一个新元素插入到数据库中,执行以下步骤:

1) 从对话框调用

viewModel.createItem()

2) 在视图模型中

fun createItem() {
    return repository.insertItem(Item("${name.value}"))
}

3) 存储库看起来像

@Singleton
class Repository @Inject constructor(
    private val appExecutors: AppExecutors,
    private val itemDao: ItemDao
) {

    fun insertItem(item: Item) {
        appExecutors.diskIO().execute{ itemDao.insert(item) }
    }

    fun loadItemList() = itemDao.getItemList()
}

4) 道

@Dao
interface ItemDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(item: Item) : Long

    @Query("SELECT * FROM item ORDER BY name")
    fun getItemList() : LiveData<List<Item>>
}

5) 物品

@Entity (tableName = "item")
data class Item(
        @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id") val id: Long,
        @ColumnInfo(name = "name") val name: String
) {
    @Ignore
    constructor(name: String) : this(0, name)
}

然后我想导航到插入项目的详细信息片段。所以我需要这个项目的 id,它是由 Room 返回的。但是如何从存储库中的执行方法返回 id?或者,也许您知道另一种方法。

附:我使用 Dagger 和所有架构组件库。

【问题讨论】:

    标签: android android-room android-architecture-components


    【解决方案1】:

    itemDao.insert(item) 已经返回了新元素的 id。您现在需要做的是通过回调将此 id 发送回您的前端(或任何您想使用新 id 的地方)。

    你可以创建一个监听器:

    interface ItemInsertedListener {
        fun onItemInserted(itemId: Long)
    }
    

    将接口添加为insertItem 方法的可选参数:

    fun insertItem(item: Item, callback: ItemInsertedListener?) {
        appExecutors.diskIO().execute {
            val id = itemDao.insert(item)
            callback?.onItemInserted(id)
        }
    }
    

    最后通过createItem 方法将ItemInsertedListener 传递给您的repo。当回调返回时,您可以将用户重定向到片段,假设活动仍然可见。还要记住,回调可能在不同的线程上运行,因此在进行 UI 更改之前明确切换到 UI 线程。

    【讨论】:

    • 显式切换到 UI 线程。你的意思是这样的吗? activity?.run { runOnUiThread { Navigation.findNavController(this, R.id.fragment_container) .navigate(R.id.detail_fragment) } }
    • 感谢@MarkusPenguin。这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多