#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. о, я понял. большое спасибо