2014-01-28 3 views
1

У меня есть (концептуальная) база данных 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.

+0

У меня возникла аналогичная проблема. Вы нашли какие-то решения? – Sorin

+0

Пока ничего. Я отложил работу по синхронизации в моем программном обеспечении до тех пор, пока это НЕОБХОДИМО выполнить. – timsworth

ответ

0

Не уверен, что если вам нужен этот ответ больше, но идти по мысли помогать общине, здесь идет:

Я бегу через подобную проблему с моим приложением. Я решил использовать Composite PK, как описано в this вопрос, сделанный пользователем @ user1843640.

Хотя вопрос, похоже, не имеет правильного ответа, сам вопрос помог мне разобраться в проблеме. Через две недели, я закончу свою реализацию, и, поскольку это академическая работа, которую я разрабатываю, я сделаю доступный источник доступным в GitHub. Я вернусь сюда, когда это будет сделано :)

+0

Мне будет интересно увидеть вашу реализацию этого, ура! – timsworth

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