一、數據庫表設計
1、客戶端表設計
每條記錄包含兩個用來同步用的字段:
status : 用來標識記錄的狀態
anchor : 記錄服務端同步過來的時間戳
status 含義
0 本地新增
-1 標記刪除
1 本地更新
9 已同步
2、服務端表設計
每條記錄包含一個用來同步用的字段:
modified : 服務端修改記錄的時間戳
二、同步方案
1、服務器下行同步方案
服務器新增數據同步到客戶端
服務器刪除數據(級聯刪除)同步到客戶端
服務器更新數據,如果客戶端未更新,則客戶端數據同步,如果客戶端更新,則不更新數據
2、服務器上行同步方案
客戶端新增數據同步到服務器
客戶端刪除數據(級聯刪除)同步到服務端
客戶端更新數據同步到服務端
三、同步算法
1、客戶端請求最新數據,客戶端取每張表中status==9的記錄里面最新的數據,
參數數組
{
{
表名:
時間戳:
}
}
2、服務端響應數據,服務端查詢時間戳大於每個表的時間戳的記錄,將該記錄返回,每個表返回一個集合,表順序是主表在前,附表在后;表內記錄順序按時間戳升序排列!!
{
表名:表數據集合
}
3、客戶端得到數據后,記錄為新增則插入數據,記錄為刪除則刪除數據,記錄為更新判斷客戶端是否修改,如修改則部做任何操作,如未修改則改為服務器數據。,並將時間戳更新服務器時間戳,status更改為9
4、客戶端將所有上傳數據更新到服務端
{
表名:{}
}
5、服務端收到上傳數據后,根據增刪改狀態更新服務器數據庫,並將這些數據時間戳返回客戶端
{
表名:{服務端id,時間戳,客戶端id}
}
6、客戶端收到數據后,根據id將時間戳插入數據庫,,並將status更改為9。
四、服務端更新
修改時,插入時間戳,刪除時,設置刪除標識
五、客戶端更新
修改時,將status更新下
更新時,只有當status=9 才修改status的值
六、圖片同步過程
客戶端定義圖片表,包括圖片id、圖片路徑、上傳或者下載標識、圖片狀態。
服務器更新數據涉及圖片的,將圖片路徑、圖片id插入圖片表,圖片標識設置為下載。圖片狀態為待下載。
客戶端更新數據涉及圖片的,將圖片路徑、圖片ID插入圖片表,圖片標識設置為上傳。圖片狀態為待上傳。
待數據更新完成后,查詢圖片表,上傳待上傳圖片,下載待下載圖片。
附:數據接口
1、客戶端請求最新數據,客戶端取每張表中status!=9的記錄里面最新的數據,
參數數組
{
{
表名:
時間戳:
}
}
請求數據
POST 接口地址
相關數據庫表:
參數
public class par{
string tableName ;
long timestame;
}
public class parResponse{
list<par> parList;
}
正確返回值
{
"meta": {
"success": true,
"message": "ok"
},
"data": $data
}
Data說明
Public class getDataRequest{
List<requestData> dataList;
}
public class requestData{
string tableName ;
list<string> dataList;
}
2、服務端響應數據,服務端查詢時間戳大於每個表的時間戳的記錄,將該記錄返回,每個表返回一個集合,表順序是主表在前,附表在后;表內記錄順序按時間戳升序排列!!
{
表名:表數據集合
}
3、客戶端得到數據后,記錄為新增則插入數據,記錄為刪除則刪除數據,記錄為更新判斷客戶端是否修改,如修改則部做任何操作,如未修改則改為服務器數據。,並將時間戳更新服務器時間戳,status更改為9
4、客戶端將所有上傳數據更新到服務端
{
表名:{}
}
5、服務端收到上傳數據后,根據增刪改狀態更新服務器數據庫,並將這些數據時間戳返回客戶端,並將status更改為9
{
表名:{服務端id,時間戳,客戶端id}
}
上傳數據
POST 接口地址
相關數據庫表:
參數
Public class uploadDataResponse{
List<requestData> dataList;
}
public class responseData{
string tableName ;
list<string> dataList;
}
正確返回值
{
"meta": {
"success": true,
"message": "ok"
},
"data": $data
}
Data說明
Public class getDataRequest{
List<requestData> dataList;
}
public class requestData{
string tableName ;
list< parData > dataList;
}
public class parData{
string serverId;
long timestamp;
string clientId;
}
6、客戶端收到數據后,根據id將時間戳插入數據庫。