2015-07-27 3 views
0

Я работаю с SQLite в Android. У меня есть объект модели, который содержит три списка, один из которых представляет собой список списков. Поэтому у меня есть пять таблиц: A для объекта, B для списка списков, C для его списков и D и E для двух других списков. Случай, который меня озадачил, - это если пользователь обновляет существующий объект и может или не мог внести никаких изменений в его списки. Я думаю, что мне придется запросить каждую таблицу B через E для записей, чьи внешние ключи соответствуют первичному ключу записи, которую я обновляю, и затем прокручивать эти результаты, чтобы увидеть, есть ли у меня соответствующий элемент в списках, вручную удаляя/вставка/обновление по мере необходимости. Но мне кажется, что должен быть лучший способ?Атомно обновлять несколько связанных таблиц

Связанные вопросы: Если я завершу всю операцию в beginTransaction() и setTransactionSuccessful(), мне нужно сделать что-нибудь еще, чтобы обеспечить атомарность? Я никогда не сталкивался напрямую с блокировками в своих базах данных, мне нужно добавить проверку ошибок в мои существующие запросы для обработки события, в котором они заблокированы? Есть ли ошибка, в которой мне нужно будет вручную отменить транзакцию, или это произойдет автоматически, когда я закрою соединение с базой данных?

+0

Вам просто нужно обернуть запросы в блок транзакций (начать/зафиксировать части, которые в android перевести на упомянутые вами методы). Вам не нужно делать какие-либо проверки самостоятельно. Вам не нужно беспокоиться о замках. Если что-то пойдет не так, вы получите исключение, которое будет содержать сведения о том, что пошло не так. Вы можете зайти в тупик с MySQL (не уверен в SQLite, но это может быть одно и то же), и в случае тупика вам просто нужно повторить транзакционные + запросы. – Mjh

ответ

0

Посмотрите на триггеры SQLite here. Это именно то, что вам нужно.

Если какая-либо ошибка произошла где-то после beginTransaction(), попробуйте поймать исключение и не отмечайте эту транзакцию как успешную. Без setTransactionSuccessful() вызов ваших данных не будет затронут.

+0

Похоже, что было бы очень полезно, если бы данные, которые мне нужно обновить в таблицах B-E, дублировались из таблицы A, но в этом случае данные, которые мне нужно сравнить, только в объекте, который я пытаюсь сохранить. – TBridges42

Смежные вопросы