Room 从 execute 方法获取 id

Room get id from execute method

我有一个带有 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 return 编辑的。但是我如何 return id 来自存储库中的执行方法?或者,也许您知道另一种方法。

P.s。我使用 Dagger 和所有架构组件库。

itemDao.insert(item) 已经 returns 新元素的 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 传递给您的存储库。当回调 returns 时,您可以将用户重定向到片段,前提是 activity 仍然可见。还要记住,回调可能 运行 在不同的线程上,因此在进行 UI 更改之前明确切换到 UI 线程。