房间从执行方法获取ID

时间:2018-09-19 11:53:40

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

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

1)从对话框调用

viewModel.createItem()

2)在ViewModel中

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,该ID由Room返回。但是,如何从存储库中的execute方法返回ID?也许您知道另一种方法。

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

1 个答案:

答案 0 :(得分:0)

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

最后使用ItemInsertedListener方法将createItem传递到您的仓库。当回调仍然返回时,您可以将用户重定向到Fragment,因为该活动仍然可见。另外请记住,回调可能在其他线程上运行,因此在进行UI更改之前,请明确切换到UI线程。