Синхронизация клиентской базы данных SQLite с базой данных сервера MySQL

Я создал приложение в xcode с sqlite3.Я хочу создать кнопку с именем sync для синхронизации с моей базой mysql на моем сервере. Любое предложение о процессе синхронизации? Пожалуйста, дайте мне знать.

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

Полагаю, вы понимаете, что это нетривиальная проблема. Я написал библиотеку, чтобы выполнить это для коммерческого приложения в прошлом году, и потребовалось около 6 месяцев, чтобы добраться до того места, где я был доволен этим.

Оставляя в стороне аргумент использования портов 80 и HTTP (TCP / IP), чтобы избежать проблем с брандмауэром и поддержкой, вам необходимо разработать протокол. Поскольку мой проект был очень интуитивным, я пошел с бинарным протоколом (а не раздутым xml), который мог обрабатывать любые данные. Я также хотел, чтобы он был двунаправленным, чтобы я мог вставлять данные INSERT, а также выполнять запросы. Я использовал CGI / FastCGI на сервере.

Бинарный протокол, который я разработал, довольно прост (всегда лучше) и разбивает большие передачи на куски определенного пользователем размера (около 600 тыс. Кажется хорошим). Каждый кусок имеет заголовок, за которым следуют данные.

Хотя этот протокол может использоваться для передачи любых данных, как правило, он используется для данных стиля базы данных по вашему запросу. Чтобы это сделать, я решил использовать подход к дизайну строк / колонок. Данные хранятся по одной строке в то время, каждый из столбцов хранится для первой строки, затем все столбцы для строки 2 … строка n.

Формат данных с отдельными столбцами:

' Col1Type 1Bytes - BYTE ' Data Type (REMSQL_TEXT etc) ' Col1Len 4Bytes - DWORD ' Length in bytes the Column Data - up to 4.2GB ' Col1Data nBytes - BYTE ' String data 

(в C, BYTE – CHAR)

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

 REMSQL_NONE = 0 ' DataType undefined REMSQL_QUAD = 1 ' 64-bit signed integer REMSQL_DBLE = 2 ' 64-bit IEEE floating point number REMSQL_TEXT = 3 ' STRING - (CHAR) string of Ascii Bytes REMSQL_BLOB = 4 ' BLOB - (CHAR) string of Binary Bytes REMSQL_NULL = 5 ' NULL - Empty Column 

Эти типы данных совпадают с базовыми типами данных SQLite и численно эквивалентны перечислению фундаментальных данных SQL3.

В этом дизайне, если поле пусто (NULL), вы сохранили только 5 байтов. Если поле имеет 200 байтов текста, например, для его хранения требуется только 205 байтов. Большее преимущество заключается в анализе данных, поскольку пропуски столбцов можно выполнить без прочтения всех 200 байтов, чтобы найти какой-то завершающий символ.

Заголовок Chunk должен содержать такие вещи, как количество строк, количество столбцов, общее количество байтов и т. Д. Если вы используете DWORD (целые числа без знака), теоретический предел для куска составляет 4.2gigs, что должно быть достаточным даже для передачи по локальной сети.

Для реализации этой функции требуется написание оболочек SQLite / MYSQL. Я использую исключительно протокол BINARY, который занимает немного времени, но вам необходимы следующие функции: Клиентская сторона: SendRequest () – Отправляет запрос, ждет ответа

Сторона сервера: ProcessRequest () – получает запрос, обрабатывает и возвращает ответ

В моем случае ответ может быть! 00MB данных или больше. Я извлекаю весь dataset из MySQL и сохраняю его на диске на сервере. Затем я возвращаю пустой кусок, который содержит метрики набора данных. Затем клиент запрашивает dataset в кусках по 600 тыс., Один за другим. Если соединение потеряно, оно просто поднимается там, где оно было остановлено.

Наконец, dataset был в основном текстовым (адреса имен и т. Д.), Поэтому он созрел для сжатия. Безопасность была очень большой проблемой в этом случае, поэтому шифрование было необходимо. Это немного усложняется для реализации, но в основном вы сжимаете весь fragment, pad до длины, которая кратно блочным шифрам BLOCKSIZE и шифрует ее.

В процессе всего этого я пишу очень быстрый class построителей строк, реализацию AES-шифрования в ASM и всю библиотеку FastCGI (www.coastrd.com)

Как я уже сказал, нетривиальным. Я скоро сделаю эту библиотеку доступной. Если вы хотите проверить это, напишите мне.

После того, как вы напишете сообщение, вы можете приступить к разработке синхронизации. Я бы либо использовал hash для каждой записи, либо простой логический флаг. Если что-либо изменится на сервере, просто отправьте всю запись и перезапишите ее на стороне клиента (при условии, что вы пытаетесь синхронизировать клиентов …)

Если вы напишете свой собственный, пожалуйста, напишите здесь о своем опыте!

PS. Подумайте об изменении названия, чтобы быть более дружественным к поиску. Возможно, что-то вроде:

«Синхронизация клиентской базы данных SQLite с базой данных сервера MySQL»

Я считаю, что вы говорите, что у вас есть сервер MySql, работающий на одном компьютере, и вы используете приложение с экземпляром sqlite и хотите обновить сервер sqlite, если на сервере MySql есть новые данные.

Я бы сделал это так

1) Убедитесь, что таблица на вашем компьютере и в приложении имеет одинаковую структуру. Включить последнее обновленное поле

2) Чтобы проверить, кто больше всего подходит, получите последнюю строку по вашему уникальному ключу, а затем сравните обновленное поле.

3) Когда самое последнее поле относится к серверу, выясните, сколько строк отличается и начните копировать их в цикле do … while () или, тем не менее, вы предпочитаете.

Если вы реализуете этот код как на сервере, так и на клиенте, то они могут обновлять друг друга или если вы предпочитаете только обновление клиента.

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

Несколько вопросов:

  • Вы пытаетесь выполнить двустороннюю синхронизацию или просто извлекаете обновления с сервера?
  • Какие операции обновления допустимы? Вставка / Update / Delete? Обычно в реплицированных базах данных удаляются.

Если вам нужно только вытащить вставки / обновления с сервера, вы можете создать PHP-скрипт, который вернет операторы SQLite для выполнения. Скрипт php будет принимать параметр последней последовательности обновлений / времени от клиента.

Если вы планируете выполнять синхронизацию в двух направлениях, вам нужно подумать о слияниях и разрешении конфликтов. Для двух сторон лучше всего, чтобы каждая сторона имела очередь транзакций. Просто записывайте каждую инструкцию CRUD, выполненную против базы данных. При синхронизации выполняйте эти инструкции, а затем обрезайте очередь.

SQuirreL SQL (в Java с использованием Hibernate) имеет плагин DBCopy. С этим можно было бы скопировать копию базы данных. Я не пробовал, но это первое направление, в которое я бы пошел.

EntropyDb имеет функцию автоматической репликации, которая может обрабатывать этот

  • Как масштабируемый SQLite?
  • SQLite добавить первичный ключ
  • Могу ли я загрузить SQLite db on / sdcard и получить доступ к нему из своего приложения для Android?
  • Тип DATETIME объекта Objective-C и sqlite
  • Android Удалить запрос
  • Скорость вставки SQLite замедляется по мере увеличения количества записей из-за индекса
  • Хранить Android SQLite
  • выберите отдельное значение в android sqlite
  • Как сохранить разрешение в API API 19 (KitKat)?
  • ALTER COLUMN в sqlite
  • Как создать пользовательскую функцию в SQLite?
  • Давайте будем гением компьютера.