Проверьте, вставлена ​​ли строка в базу данных Room

Я вставляю строки в базу данных Room и хочу проверить, успешно ли вставлена ​​строка.

Это мой Дао

@Insert()
suspend fun insertOfflineData(offlineData: OfflineData): Long

@Entity
data class OfflineData(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "request_info_json")
    val requestInfoJson: String
)

Когда я вставляю строку, ответ равен 1,2,3 и т. д. Итак, возвращается id (правильно?)

Итак, чтобы проверить, правильно ли вставлена ​​​​строка.

Могу ли я просто проверить, что вставленный rowId больше 0, тогда он успешно вставлен в БД.

private suspend fun insertOfflineData(offlineDataRequestInfo: String): Long {
        var result: Long = 0
        result = OfflineDatabaseManager.getInstance(app.applicationContext).insertOfflineData(
            OfflineData(
                0,
                offlineDataRequestInfo
            ))
        if(result > 0 ) {
            //SUCCEFFLULLY INSERTED
        } else {
            //UNSUCCESSFULL
        }
        return result
    }

Примечание: результат, который я получаю, равен 1,2,3 и т. д., который должен быть идентификатором строки.

Пожалуйста, подскажите, правильный ли это подход? В основном, если вставка не удалась, я хочу, чтобы пользователь не продолжал дальше

Спасибо за ваши предложения и вклад R


person BRDroid    schedule 23.10.2020    source источник
comment
Насколько я знаю, когда новая строка добавляется в db, Room всегда будет возвращать значение primaryKey этой строки, т.е. Long. Если вы выбрали autoGenerate=true, комната сгенерирует его, иначе вы должны указать его.   -  person Mohammed Farhan    schedule 23.10.2020
comment
что я хочу проверить, так это то, что если результат > 0, это означает, что комната успешно вставила строку, а если нет, то неудачно. ~Правилен ли этот подход при проверке того, успешно ли сохранены мои данные в комнате?   -  person BRDroid    schedule 23.10.2020
comment
rowId ‹0 всегда означает сбой.   -  person Mohammed Farhan    schedule 23.10.2020
comment
хорошо, так что вы имеете в виду, что это никогда не произойдет?   -  person BRDroid    schedule 23.10.2020
comment
Теперь я не уверен, какие сбои вы ожидаете, но вы можете указать стратегию конфликта для вставок, и если это не связано с конфликтом, я почти уверен, что будет выбрано исключение. Я не думаю, что вы можете делать предположения, основанные на значении rowId, кроме как если вы получили тот, вставка которого прошла успешно.   -  person patrick.elmquist    schedule 23.10.2020
comment
тогда каким будет подход, чтобы проверить, если операция вставки в базу данных не удалась (неудачная), пожалуйста   -  person BRDroid    schedule 23.10.2020
comment
как я могу поймать это исключение, пожалуйста, и где я должен включать этот код, не могли бы вы поделиться примером   -  person BRDroid    schedule 23.10.2020
comment
Да, я никогда не попадал в такое состояние, когда моя строка не добавлялась. Даже если у вас есть какая-либо ошибка в схеме таблицы, Room сообщит вам об этом при компиляции самого проекта, например, если у вас есть запрос с неверными параметрами.   -  person Mohammed Farhan    schedule 23.10.2020
comment
Но для конфликтов вы можете переопределить его с помощью стратегий конфликтов. Вам следует беспокоиться об этом, если вы выбрали autoGenerated=false для первичного ключа любой таблицы.   -  person Mohammed Farhan    schedule 23.10.2020
comment
Я думаю, что пока меня не беспокоят конфликты, моя главная задача - проверить, успешно ли вставлена ​​​​строка, если не вставлена, как я могу узнать, что это ошибка, или как поймать это исключение, пожалуйста   -  person BRDroid    schedule 23.10.2020


Ответы (2)


Согласно документам здесь Room Dao @Insert

Если метод @Insert получает только 1 параметр, он может вернуть длинное значение, которое является новым идентификатором строки для вставленного элемента. Если параметр является массивом или коллекцией, вместо этого он должен возвращать long[] или List.

Суть в том, что метод, аннотированный аннотацией @Insert, может возвращать:

  1. длинное значение для одной операции вставки.
  2. a long[] или Long[] или List для нескольких операций вставки.
  3. void, если вам не нужны вставленные идентификаторы.

Если возвращаемое значение равно -1 или отрицательное, считается, что операция завершилась неудачно в соответствии с документами .

Изменить Ответ на комментарий @patrick.elmquist

Из сгенерированного кода комнаты. EntityInsertionAdapter и SupportSQLiteStatement

/**
     * Execute this SQL statement and return the ID of the row inserted due to this call.
     * The SQL statement should be an INSERT for this to be a useful call.
     *
     * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
     *
     * @throws android.database.SQLException If the SQL string is invalid for
     *         some reason
     */
    long executeInsert();
person Jayanth    schedule 23.10.2020

Вы можете использовать библиотеку отладки базы данных, например эту.

person ruben    schedule 23.10.2020
comment
спасибо за ответ, за отладку этого хорошего, но моя цель проверки не в отладке, а в том, чтобы помешать пользователю продолжить работу в приложении - person BRDroid; 23.10.2020