我有一个带有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和所有架构组件库。
答案 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线程。