Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sync offline HTML5 webdatabase with centralised database

I'd like to be able to do the following in a HTML5 (iPad) web app:

  • upload data to an online database (which would be probably <50Mb in size if I was to build the online database in something like SQLite)
  • extract either a subset or a full copy of data to an offline webdatabase
  • (travel out of 3G network coverage range)
  • perform a bunch of analytic-type calculations on the downloaded data
  • save parameters for my calculations to the offline webdatabase
  • repeat, saving different parameter sets for several different offline analytic-type calculation sessions over an extended period
  • (head back into areas with 3G network coverage)
  • sync the saved parameters from my offline webdatabase to the central, online database

I'm comfortable with every step up till the last one...

I'm trying to find information on whether it's possible to sync an offline webdatabase with a central database, but can't find anything covering the topic. Is it possible to do this? If so, could you please supply link/s to information on it, OR describe how it would work in enough detail to implement it for my specific app?

Thanks in advance

like image 406
monch1962 Avatar asked Dec 20 '10 10:12

monch1962


2 Answers

I haven't worked specifically with HTML5 local databases, but I have worked with mobile devices that require offline updates and resyncing to a central data store.

Whether the dataset is created on the server or on the offline client, I make sure its primary key is a UUID. I also make sure to timestamp the record each time its updated.

I also make not of when the last time the offline client was synced.

So, when resyncing to the central database, I first query the offline client for records that have changed since the last sync. I then query the central database to determine if any of those records have changed since the last sync.

If they haven't changed on the central database, I update them with the data from the offline client. If the records on the server have changed since last sync, I update them to the client.

If the UUID does not exist on the central server but does on the offline client, I insert it, and vice versa.

To purge records, I create a "purge" column, and when the sysnc query is run, I delete the record from each database (or mark it as inactive, depending on application requirements).

If both records have changed since last update, I have to either rely on user input to reconcile or a rule that specifies which record "wins".

I usually don't trust built-in database import functions, unless I'm importing into a completely empty database.

like image 157
CurtisMO Avatar answered Nov 07 '22 18:11

CurtisMO


Steps:

  1. Keep a list of changes on the local database.
  2. When connected to remote database, check for any changes since last sync on remote.
  3. If changes on remote side has conflicts with local changes, inform the user on what to do.
  4. For all other changes, proceed with sync:
    1. download all online changes which did not change locally.
    2. upload all local changes which did not change remotely.

This method can actually work on any combination of databases, provided there is a data convertor on one side.

like image 38
syockit Avatar answered Nov 07 '22 20:11

syockit