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 线程。
我有一个带有 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 线程。