База данных номеров: как получить ответ после вставки данных?

#android #kotlin #android-room

Вопрос:

я хочу что-то сделать, когда вставлю данные, но я не знаю, как это сделать. это структура базы данных моей комнаты.

Модель

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

всем хорошего дня!

Комментарии:

1. Вы можете сделать это в следующей строке, потому что вы уже находитесь внутри области сопрограммы . Если вы хотите получить идентификатор вновь вставленного элемента, вы также можете заставить его вернуть идентификатор . Также viewModelScope.launch работает при вызове диспетчера, я думаю . вам нужно передать диспетчеру также, как viewModelScope.launch(Dispatcher.IO) .

2. @ADM На самом деле нет необходимости менять диспетчер, потому что комната автоматически переключается в фоновый поток перед выполнением каких-либо операций ввода-вывода.

3. Да, извини, забыл об этом. Комната делает это внутренне

4. спасибо всем вам, у меня есть способ

Ответ №1:

Если вы хотите получить идентификатор после успешной вставки данных в базу данных, добавьте Long в качестве возвращаемого типа следующий

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

Для коллекции, которую вы можете добавить Listlt;Longgt; в качестве типа возврата

Комментарии:

1. о, я понял. большое спасибо