Сделка с базой данных ROOM - PullRequest
0 голосов
/ 05 марта 2020

У меня есть вопрос о транзакциях в базе данных ROOM. Можно ли использовать аннотацию @Transaction вне объектов DAO?

У меня сложный объект для сохранения, поэтому я делаю это с помощью менеджера, который вызывает много методов из разных daos. Но я хочу откатить транзакцию, если какой-либо метод завершится неудачей.

Он работает с

roomDB.runInTransaction { 
dao1.insert(object.object1)
dao2.insert(object.object2)
dao3.update(objec.object3)
}

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

W/SQLiteCompiledSql: Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: DELETE FROM tableName WHERE status IN ( ?,? )
    net.sqlcipher.database.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

Пример метода, который я использую:

    @TypeConverters(NameConverter::class)
    @Query("UPDATE tableName SET status = :status, last_update_date = :updateDate , finish_date = :finishDate, problem_reason = :problemReason WHERE id = :id")
    fun updateStatus(id: Long, status: WorkerStatus, updateDate: Long, finishDate: Long?, problemReason: String?)

Нужно ли добавлять дополнительную аннотацию к методу, чтобы закрыть курсор?

Спасибо за любой совет;)

...