【问题标题】:Room Database: how to get reponse after insert data?房间数据库:插入数据后如何获得响应?
【发布时间】: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


【解决方案1】:

如果你想在数据成功插入数据库后获取Id,添加Long作为返回类型如下

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertMessageDAO(messageModel: MessageModel): Long

对于集合,您可以添加 List<Long> 作为返回类型

【讨论】:

  • 哦,我明白了。非常感谢
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 2023-01-12
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多