[英]What is the best approach for sync local database sqlite with Production server (MySQL)?
我正在使用transaction.executeSql()為sqlite db和Javascript(Cordova)執行sql查詢。 我需要將最后執行的查詢存儲在表中以供將來使用(同步)。 我沒有找到類似的東西。 有什么建議嗎?
db.transaction(function(tx) {
tx.executeSql("Insert into tablename (id, name) Values(?,?);", values, function(tx, results)
{
// I need the last executed query here.
});
數據正在sqlite離線更新。 當用戶點擊“同步”按鈕時,我將不得不將該用戶的所有更新推送到服務器。 所以,我以為我會將這個用戶執行的所有查詢存儲在一個表中。 當他/她點擊同步按鈕時,我將在實時mysql上執行這些查詢。
編輯1:這不僅用於備份目的。 用戶可以添加一些新項目並更新它們。 所有其他用戶應在同步后在其數據庫中獲得此更改。 值得注意的是,溝通將是雙向的。 首先,sqlitedb將從實時服務器更新,然后我將在實時服務器中執行所有已保存的查詢。 這是計划。
有沒有更好的方法?
如果數據庫的大小合理,您可以壓縮它並同步“.db.gz”文件。 如果您存儲每個SQL查詢並同步它,您最終可能會得到類似的結果
DELETE FROM x where a=1
UPDATE x set a=2,b=3
INSERT INTO x set c=2
但是,如果同步“.db”文件,它將只包含INSERT語句以及模式定義。 但是,在服務器端,您需要有效地將其導入MYSQL。
如果它僅用於備份目的,並且您不需要生成任何報告,或者您不需要合並所有這些用戶數據,那么只需將SQLite存儲在服務器上即可生存。 但我不知道你的項目到底是什么。
我在幾個帶有后端的企業應用程序中使用同步,這是我的方式:
如果可能的話,使用SSL。
在我的工作流程中,設備通過掃描后端網站中的條形碼進行注冊。 作為后退,可以在設備上以表格形式進行注冊。
我使用編碼來傳輸數據。 每個設備都有自己的代碼。 密鑰通過條形碼/表格到達設備。
我在后端有以下客戶端表:
在每個必須同步的表中,我都有一個創建和修改的列。 它是一個日期時間,並且由觸發器插入創建/修改。
在同步任務中,設備正在將UUID發送到服務器,服務器查找有效的注冊,自上次同步以來創建的行,自上次同步以來修改的行以及行刪除作業。
同步日期時間保存在tblClientLogs中
8.加密數據,后端發送到客戶端是對象,看起來像:
tblWhatEver - > create - > {key:value,key:value,...}
要么
tblWhatEver - > modify - > rowUUID {key:value,key:value,...}
要么
tblWhatEver - > delete - > rowUUID
deviceUUID,tableName,rowUUID
在同步任務之后,將在tblClientDelete中刪除device-delete-job。
在將數據接收到設備后,我解密它並為每個數據創建一個sql語句。 sql作業由循環完成。
在設備上完成所有作業后,我會向后端發送一個小報告,以檢查一切是否順利。
在每個設備表中,我使用UUID而不是整數來避免沖突。 在我的設備上,您也可以將數據發送到服務器,它的工作方式類似於«下載»。
我的應用和服務器的時區是相同的,與設備位置無關。
在后端和應用程序中,如果出現問題,我會從頭開始包含強制同步。
在某些應用程序中,我有更多選項,我可以通過后端更改數據庫,表結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.