2015-09-05 41 views
4

我提出其中有一個數據庫模型的應用:在同步到服務器之前,在本地android db上設置什麼主鍵?

Item (int id, String name, String description, Date updatedDate, boolean isSynced) 

Itemid是它的主鍵(在當地以及服務器)和 id是在服務器的MySQL數據庫自動生成的。我正在使用realm在Android設備上存儲Items

用戶可以在帶/不帶互聯網的設備上創建和編輯Items。數據庫在互聯網連接可用時同步。

所以當用戶保存一個新Item,那麼什麼id我應該保存它的本地數據庫,以便與服務器同步它並不會造成問題

約翰有3 Items在他的Moto X以及三星S6和兩個手機都同步到服務器。

他把極限摩托飛行模式和三星S6其被同步到服務器增加了一個Item。現在

S6有項目與IDS - > 1,2,3,4

極限摩托有項目與IDS - > 1,2,3

當摩托X將連接到互聯網,然後它會下載Itemid = 4,但它仍然在飛機模式。

雖然Moto X仍然處於離線狀態,但約翰在其上添加了一個Item。我應該在本地db上給這個新的Item分配什麼樣的ID,以便在Moto X同步時不會造成任何問題? John應該能夠在離線Moto X上編輯這個新的Item,所以id不能保持爲空。

謝謝

+0

每次當您從任何設備從服務器添加項目回到它的主鍵/唯一的ID和更新與響應ID添加的項目.. \ – koutuk

+1

是關當然你也可以通過離線本地主鍵編輯添加一個明杆多服務器時間主鍵更新新的服務器主鍵coloum – koutuk

+0

或者你可以設置一些規則的id。就像在本地創建的項目id在0xF0000000開始(僅對該設備有意義),並且在與服務器同步後,該id將由服務器分配給類似於0x00000012(由所有設備/服務器全局使用)的東西。然後,在本地使用的臨時可能會被丟棄。 – beeender

回答

4

只是spitballing ...

添加int local_idint device_id到項目類。每個與服務器交互的設備都將獲得唯一且持久的device_id。當在沒有互聯網連接的設備上創建項目時,如果需要編輯項目,設備可以引用local_id。當設備連接並且項目(!isSynced & & id == null)時,將該項目發送到數據庫以進行插入操作,然後通過搜索local_id和device_id來查找新插入的DB行的主鍵。將主鍵值發送回設備,並將服務器上的項目主鍵設置爲Item的本地副本上的id,並將isSynced設置爲true。

ETA:當從其他設備上創建的數據庫服務器中檢索項目時,將這些項目放入設備表格時,您需要省略外部local_id

ETA2:而且您需要更改設備上的表格設置,以便local_id是主鍵,id是UNIQUE。但當然id仍然是數據庫服務器上的主鍵。

相關問題