Sqlbrite запускает операции вставки и запроса одновременно, запрос получит нулевой результат

Приложение имеет два фрагмента в одном действии. У фрагмента A есть кнопка, после чего нажатие кнопки запустит параллельную задачу, которая вставит или обновит множество записей в базе данных. Фрагмент B включает ViewPager, ViewPager использует FragmentStatePagerAdapter и удерживает фрагмент C, и каждая страница будет запрашивать и отображать запись из базы данных.

Фрагмент B будет работать правильно, пока не будет нажата кнопка во фрагменте A. После этого случайные страницы в ViewPager не будут работать должным образом. Некоторые страницы будут запрашивать пустую запись, если она существует. И есть две ситуации.

В первой ситуации фрагмент A будет выполнять операции вставки и обновления. Это наихудший случай, некоторые указанные записи получат нулевой результат во фрагменте C, даже если сдвинуть ViewPager, чтобы повторно открыть указанную страницу, запись все еще будет нулевой до тех пор, пока параллельная задача во фрагменте A не будет завершена и повторно не откроет фрагмент B, затем Фрагмент C снова может работать правильно.

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

Что вызывает эти проблемы? Заранее спасибо.

0
0
176
1

Ответы 1

Я не уверен, но я думаю, что вам нужно использовать Обработку транзакций для операций с базой данных во фрагменте A. Когда вы вставляете или обновляете данные в базе данных из фрагмента A, вам необходимо использовать следующие методы:

database.beginTransaction();
database.setTransactionSuccessful();
database.endTransaction();

Пожалуйста, проверьте эту ссылку, чтобы получить подробное описание этих методов и использования. http://www.tothenew.com/blog/sqlite-locking-and-transaction-handling-in-android/

Спасибо за ваш ответ. Поскольку я использую SqlBrite с ContentResolver, я не могу использовать транзакцию напрямую. Я могу использовать ContentResolver.bulkInsert() или ContentResolver.applyBatch() для вставки данных, я выбираю ContentResolver.bulkInsert() для вставки большого количества данных. Но я не могу использовать ContentResolver.applyBatch() для обновления данных, потому что мне нужно использовать оператор обновления или запроса, чтобы проверить, существует ли запись, использовать результат, чтобы решить, нужно ли вставлять запись в базу данных. Хотя я использую ContentResolver.bulkInsert(), проблема все еще существует.

KpSt 09.04.2018 18:39

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