Транзакции в GreenDao

Я использую GreenDao для хранения большого количества данных, поступающих из службы REST.

Многие из моих сущностей связаны с отношениями. Все отлично работает, но завтра я должен реализовать надежный рабочий процесс.

Когда я загружаю свои данные, я должен проверить, происходит ли ошибка. Если это так, я должен убедиться, что ничего не хранится в БД SQLite.

Обычно я бы работал с транзакциями и откатом в случае исключения, в противном случае фиксирую в БД.

Сейчас я просто использую inserttordelete для сохранения объекта, каждый раз, когда я создавал объект.

Каков был бы способ реализовать это?

1 ответ

Решение

При вставке и обновлении Greendao проверяет, есть ли текущая транзакция. В этом случае greendao не начнет новую транзакцию.

Поэтому единственное, что нужно сделать, - это запустить транзакцию в вашей базе данных и зафиксировать / откатить после того, как ваша работа будет выполнена, или вы заметите ошибку. Все вставки и обновления будут в одной транзакции, что имеет преимущества как в отношении согласованности данных, так и в отношении производительности, поскольку greendao будет запускать новые транзакции с фиксацией / откатом для каждой операции вставки и обновления.

В итоге вы можете использовать такой код:

SQLiteDatabase db = dao.getDatabase();
db.beginTransaction();

try {
    // do all your inserts and so on here.
    db.setTransactionSuccessful();
} catch (Exception ex) {
} finally {
    db.endTransaction();
}

Я также немного подправил свой greendao, чтобы он не кэшировал вставленные объекты, чтобы получить дополнительные преимущества в производительности и использовании памяти (поскольку я вставляю много данных один раз и использую очень мало данных во время выполнения в зависимости от ввода пользователя). Смотрите этот пост.

Другие вопросы по тегам