У меня есть (концептуальная) база данных sqlite на сервере, которая должна соответствовать базе sqlite приложения Android, которую я собираюсь разработать.Согласный первичный ключ автоинкремента при синхронизации баз данных sqlite
Я использую первичный ключ целочисленного числа автоинкрементов для каждой таблицы с именем какой-то вариант _id, например. _entry_id или _goal_id.
Я занимаюсь синхронизацией, имея таблицу «модификаций» для каждой таблицы, которая описывает, какие действия произошли с какой таблицей и с какими элементами в этой таблице.
Пользователь имеет CHOICE для синхронизации с сервером, но это необязательно. Этот момент имеет решающее значение и, к сожалению, возможность принудительно синхронизировать пользователей с сервером при использовании приложения не представляется возможным.
У меня следующая проблема на концептуальном уровне:
Say сервер базы данных имеет одну таблицу «запись» с полями:
- «_entry_id», которая является целым числом автоинкремент первичной
- 'title', который является текстовым полем.
В настоящее время в базе данных нет записей.
Скажем, есть два устройства, на которых запущено приложение. Приложение и сервер используют одну и ту же схему базы данных.
Говорит, что device1 имеет записи:
- 0, dev1entry0
- 1, dev1entry1
Если device1 решает синхронизировать через какое-то несущественное колдовство будет решать система, что эти две записей являются новыми и будут добавлять их в базу данных сервера, поэтому в базе данных сервера теперь есть данные:
- 0, dev1entry0
- 1, dev1entry1
Теперь говорят, что устройство2 решает не синхронизирован с базой данных сервера, а затем создает несколько новых записей в базе данных и в настоящее время имеет записей:
- 0 , dev2entry0
- 1, dev2entry1
Если теперь решает синхронизировать, то система будет решать, что эти новые записи а й будет добавить их в базу данных, так что база данных теперь имеет записей:
- 0, dev1entry0
- 1, dev1entry1
- 2, dev2entry0
- 3, dev2entry1
И Устройство 2 теперь имеет следующие данные:
- 0, dev2entry0
- 1, dev2entry1
- 2, dev1entry0
- 3, dev1entry1
Теперь, любые изменения, внесенные в записи на устройство2 будет изменять неправильные записи на сервере, так как первичные ключи неверны.
Я думал о способе борьбы с этим. Поскольку это (насколько я вижу), возникает только проблема при вставке новых записей в таблицу.Моя идея заключается в следующем:
Assume the same entries for the server database as above
Assume that a new device, device3, has an entry:
- 0, dev3entry0
when an insert needs to occur when syncinc
get the id that's been assigned to device3's entry: 0
check the id against the largest id that's already been assigned to the server's db: 3
if 0 == 3 + 1 (the next increment to be assigned)
then insert the new entry to the database, the keys are the same
otherwise
duplicate the entry in device3 so that the key == 3 + 1
delete the original entry
С помощью этого алгоритма (если не принимать во внимание синхронизацию с device3 а) вы должны быть оставлены следующие данные в базе данных сервера:
- 0 , dev2entry0
- 1, dev2entry1
- 2, dev1entry0
- 3, dev1entry1
- 4, dev3entry0
И следующее в базе данных device3 по:
- 4, dev3entry0
Значение все первичные ключи последовательны.
Этот алгоритм возможен в sqlite?
Если нет, или если этот алгоритм не самый лучший, то какой другой способ справиться с этой проблемой?
Надеюсь, я был достаточно ясен в своем объяснении.
Cheers.
У меня возникла аналогичная проблема. Вы нашли какие-то решения? – Sorin
Пока ничего. Я отложил работу по синхронизации в моем программном обеспечении до тех пор, пока это НЕОБХОДИМО выполнить. – timsworth