Android - Как использовать транзакции при изменении базы данных через ContentProvider?

Когда пользователь нажимает на свою метку NFC, мое приложение:

  1. Вставляет нового пользователя в таблицу users, возвращает пользователя _id, затем
  2. Записывает это значение _id в тег NFC пользователя.

Проблема в том, что если этот пользователь уберет свой тег слишком быстро, шаг 2 завершится с ошибкой IOException. Затем пользователю придется снова коснуться своего тега, но это приведет к повторению шага 1, то есть к дублированию записей. :-/

Чтобы решить эту проблему, я хотел бы использовать транзакции на основе этот пример кода из документации API:

   db.beginTransaction();
   try {
     // Insert data into database, getting back _id
     // Write _id to NFC tag
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }

... но моя база данных завернута в MyContentProvider, поэтому у меня нет доступа к db.

Есть ли способ использовать транзакции при вставке данных, не отказываясь от использования MyContentProvider?


person ban-geoengineering    schedule 01.03.2016    source источник
comment
не используйте автоматически сгенерированный _id... используйте что-то другое, например guid   -  person Selvin    schedule 01.03.2016
comment
Спасибо. Если желаемое решение невозможно. Я учту это. (Удаление вставленной строки тоже вариант, но явно далеко не идеальный).   -  person ban-geoengineering    schedule 01.03.2016


Ответы (1)


Вы можете отменить операции: вы можете запросить в своей базе данных следующий доступный идентификатор, записать идентификатор в тег NFC, а затем обновить базу данных с помощью этого идентификатора, если вам удалось обновить тег NFC.

person Francesc    schedule 01.03.2016
comment
Спасибо за ваше предложение, но (как) можно получить следующий доступный идентификатор через поставщика контента? - person ban-geoengineering; 01.03.2016
comment
Вы можете запросить поставщика контента по идентификатору и отсортировать по убыванию. contentProvider.query(uri, new String[] {_id}, null, null, _id DESC); Получите первую запись в вашем курсоре, а затем увеличьте идентификатор на единицу. Вы также можете использовать LIMIT в своем запросе, чтобы получить только 1 запись. - person Francesc; 01.03.2016