【发布时间】:2021-10-26 05:35:05
【问题描述】:
我想在插入数据完成后做一些事情,但我不知道该怎么做。 这是我的房间数据库结构。
型号
@IgnoreExtraProperties
@Entity(tableName = "message_table")
data class MessageModel(
@NonNull
@PrimaryKey
var messageId: String = "",
var messageType: String? = null,
var messageTimestamp: Long? = null,
var messageData: String? = null,
var messageSenderId: String? = null,
var roomId: String = "",
var isSeen: Boolean = false,
var uploadSuccess : Boolean = false
) : Serializable {
}
DAO 接口
@Dao
interface MessageDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertMessageDAO(messageModel: MessageModel)
...
}
存储库
class MessageRepository(context : Context) {
private val messageDAO : MessageDAO
init {
val messageDatabase: MessageRoomDatabase = MessageRoomDatabase.getInstance(context)
messageDAO = messageDatabase.getMessageDao()
}
suspend fun insertMessageDAO(messageModel: MessageModel) = messageDAO.insertMessageDAO(messageModel)
...
}
视图模型
class MessageViewModel(private val messageRepository: MessageRepository) : ViewModel() {
fun insertMessageDAO(messageModel: MessageModel) = viewModelScope.launch {
messageRepository.insertMessageDAO(messageModel)
}
...
}
祝大家有个愉快的一天!
【问题讨论】:
-
您可以在下一行执行此操作,因为您已经在 Coroutine 范围内。如果你想获取新插入元素的 ID,你可以让它也返回 id。我猜
viewModelScope.launch也在调用调度程序上运行。你还需要像viewModelScope.launch(Dispatcher.IO)一样通过Dispatcher。 -
@ADM 实际上不需要更改调度程序,因为 Room 在执行任何 I/O 操作之前会自动切换到后台线程。
-
是的,抱歉忘记了。房间在内部做
-
谢谢大家,我有办法
标签: android kotlin android-room