Транзакции в 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, чтобы он не кэшировал вставленные объекты, чтобы получить дополнительные преимущества в производительности и использовании памяти (поскольку я вставляю много данных один раз и использую очень мало данных во время выполнения в зависимости от ввода пользователя). Смотрите этот пост.