Android как обновить, но сохранить информацию базы данных - PullRequest
6 голосов
/ 19 ноября 2011

У меня есть приложение, которое использует базу данных SQLite. Когда приложение обновляется в данный момент, оно полностью перезаписывает базу данных.

Проблема возникает, когда я хочу перенести текущий прогресс пользователей в новое обновление. Таблица БД содержит ряд вопросов. Каждая строка содержит 1 вопрос, ответы, причину правильного ответа, ответил ли пользователь на него и правильно ли ответил пользователь.

В обновлении вопрос мог быть удален и / или другие добавлены. Единственные данные, которые необходимо сохранить, - это если на вопрос был дан ответ, и на него дан правильный ответ Есть ли лучший способ для передачи данных, кроме сравнения уникального числа или строки из каждой строки старой базы данных в новую базу данных?

С более чем 100 строками кажется, что это будет очень ресурсоемким. Хотя я не вижу другого пути решения этой проблемы.

Любой совет и помощь будут с благодарностью приняты.

Ответы [ 3 ]

6 голосов
/ 14 октября 2016

Сначала присвойте каждой таблице уникальный идентификатор - первичный ключ (PK)

Таблица вопросов - отношение один к одному с пользователем
Таблица ответов - отношение один к одному с вопросом
Таблица пользователя - одинМногие отношения с вопросом

<b>Question</b>
+--------------+------------+------------------+
| int          | Id         | PK               |
| varchar(max) | question   |                  |
| int          | userId     | FK (Foreign Key) |
| bool         | answered   |                  |
| bool         | correct    |                  |
+--------------+------------+------------------+

<b>Answer</b>
+--------------+------------+----+
| int          | Id         | PK |
| int          | questionId | FK |
| varchar(max) | reason     |    |
+--------------+------------+----+

<b>User</b>
+---------------+-------------+--------------------------------------------+
| int           | Id          | PK                                         |
| varchar (250) | deviceToken | (UUiD) // some unique identifier per phone |
+---------------+-------------+--------------------------------------------+
// other relevant stuff  

Когда приложение загружено, пользователь может быть без регистрации зарегистрирован, используя UUID устройства.Центральная база данных должна будет отслеживать все эти вопросы и ответы на них, а не уничтожать их все и начинать заново.100 строк - это не много, но пользователи могут столкнуться с тысячами и более.В обновлении не имеет значения, что заполнение локальной базы данных в телефоне может быть медленным (хотя при таком количестве строк это не обязательно будет медленно, для базы данных с миллионами строк потребуется время), поскольку ожидается, что обновления потребуютвремя.

Если пользователь меняет устройство, эта информация не передается на новое устройство.Каждое устройство рассматривается как новый пользователь.Я считаю, что это хорошо работает, если вы не хотите, чтобы люди регистрировались, но хотели сохранить данные во время обновлений, или если приложение удалено и переустановлено на одном устройстве.У него есть свои ограничения, как и у людей, которые хотят зарегистрироваться.Если пользователи хотят начать игру заново с того же устройства, вы всегда можете предоставить опцию «Сбросить статистику» и затем стереть эти данные.

Общие настройки также можно использовать для сохранения пользователя.настройки для приложения, я думаю, что это может быть излишним для сотни вопросов, было бы лучше для хранения этой информации в базе данных SQLite;информация хранится на сервере.Вы не можете стирать данные каждый раз, когда происходит обновление, вы должны вести текущие записи о прогрессе потребителя.Вы не можете полагаться на устройство потребителя, чтобы сохранить информацию.Если есть какая-либо информация, которую вы хотите отслеживать, вы должны взять на себя ответственность за нее.

Эта информация может храниться локально на телефоне и регулярно синхронизироваться с сервером.

В наших приложениях именно так мы и поступаем, данные обновляются, и у нас миллионы строк.Не стесняйтесь задавать больше вопросов, однако дать фактическое руководство (или код) о том, как все это работает, - довольно широкий ответ для переполнения стека.

3 голосов
/ 19 ноября 2011

Я согласен с @Yashwanth Kumar, другой дизайн может быть лучше в долгосрочной перспективе, но 100 рядов не массивны.

Реализация логики в DBhelper.onUpgrade () .

Возможно, вы захотите посмотреть, как хранятся ответы в общих настройках, пока выполняется операция обновления, если она уничтожена системой / пользователем.

0 голосов
/ 19 ноября 2011

Я мог бы предложить альтернативу в вашем дизайне, вести 2 таблицы: одну для правильного ответа, а другую для остальных.если на вопрос был дан правильный ответ, перенесите вопрос из одной таблицы в таблицу ответов.

, чтобы при обновлении вы просто отбрасывали таблицу вопросов без ответов и заполняли ее новыми.ответы на вопросы не пострадали в пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...