SQLite的數(shù)據(jù)庫遷移

1. 前言

一般在應(yīng)用啟動(dòng)之后,都會(huì)有一個(gè)初始化的過程。此外,后續(xù)應(yīng)用升級(jí),需要考慮數(shù)據(jù)庫數(shù)據(jù)及時(shí)更新、數(shù)據(jù)庫表字段發(fā)生變化、表數(shù)據(jù)發(fā)生變化、兼容舊版本數(shù)據(jù)庫等情況,所以在應(yīng)用初期就需要考慮好數(shù)據(jù)遷移工作。

2. 方案

通過接口配合本地數(shù)據(jù)庫表來保證數(shù)據(jù)完整性與兼容性。在iOS端的數(shù)據(jù)庫中有一個(gè)TableVersion表,用來配置需要進(jìn)行數(shù)據(jù)同步的數(shù)據(jù)表信息。每次在發(fā)出數(shù)據(jù)同步請(qǐng)求的時(shí)候,都會(huì)以TableVersion表里面的數(shù)據(jù)作為依據(jù),來決定哪些表需要進(jìn)行表結(jié)構(gòu)變更,哪些表需要進(jìn)行數(shù)據(jù)更新。

2.1 TableVersion表

TableVersion表是iOS端與后臺(tái)進(jìn)行數(shù)據(jù)同步的一張重要的表,它配置了iOS端需要同步的數(shù)據(jù)表相關(guān)信息。

TableName:表名
OwnerType:表主鍵
Owner:表主鍵值
StructVersion: 表結(jié)構(gòu)版本
Version:表數(shù)據(jù)版本

TableVersion表

TableName OwnerType Owner StructVersion Version
xxx_table None 30 92279410

xxx_table表

字段1 字段2 字段3 字段4 Timestamp
xxxx xxxx xxxx xxxx 92279410
xxxx xxxx xxxx xxxx 92279400
xxxx xxxx xxxx xxxx 92279300
2.2 數(shù)據(jù)接口

CheckUpdate:用來檢測是否需要更新表結(jié)構(gòu)、表數(shù)據(jù)。
FetchSchema:用來請(qǐng)求某張表的表結(jié)構(gòu)數(shù)據(jù)信息。
FetchData:用來請(qǐng)求某張表的表數(shù)據(jù)信息。
PostData:用來上傳某張表新增或更新的數(shù)據(jù)。

2.3 數(shù)據(jù)同步步驟
  1. 獲取iOS端數(shù)據(jù)庫中的TableVersion表配置的每張表信息,調(diào)用CheckUpdate接口,獲取需要更新的數(shù)據(jù)表信息(表名、表結(jié)構(gòu)版本、表數(shù)據(jù)版本)。
  2. 在獲取的數(shù)據(jù)表信息里面,對(duì)比表的表結(jié)構(gòu)版本與iOS端TableVersion中對(duì)應(yīng)表的表結(jié)構(gòu)版本,如果需要更新則調(diào)用FetchSchema接口更新對(duì)應(yīng)表的表結(jié)構(gòu)。(SQLite只允許表新增字段,無法刪除表字段)
  3. 調(diào)用FetchData來獲取每張表需要更新的表數(shù)據(jù),使用 replace into 語句來進(jìn)行更新。
  4. PostData接口用來向服務(wù)器上傳新數(shù)據(jù)或者更改的數(shù)據(jù),Timestamp值由后臺(tái)生成。
2.4 同步補(bǔ)充
  1. 在設(shè)計(jì)同步表的時(shí)候,每張表中都需要有一個(gè)字段Timestamp,用來記錄當(dāng)前表數(shù)據(jù)的數(shù)據(jù)版本。當(dāng)此條數(shù)據(jù)發(fā)生變化的時(shí)候,需要后臺(tái)更新當(dāng)前數(shù)據(jù)的Timestamp(需要比TableVersion中對(duì)應(yīng)表的表數(shù)據(jù)版本要大,這樣才會(huì)進(jìn)行進(jìn)行數(shù)據(jù)同步),做到及時(shí)更新表數(shù)據(jù)的目的。
  2. TableVersion中的對(duì)應(yīng)表的表數(shù)據(jù)版本Version其實(shí)就是對(duì)應(yīng)表的表數(shù)據(jù)的最大Timestamp值。這樣設(shè)計(jì)方便可以對(duì)表數(shù)據(jù)進(jìn)行增量更新,而不是在更新某張表的時(shí)候?qū)⒋吮淼乃袛?shù)據(jù)拉取下來。

3. 切換用戶賬號(hào)

iOS端根據(jù)不同用戶的ID來創(chuàng)建用戶數(shù)據(jù),不同用戶的數(shù)據(jù)是分離的,存儲(chǔ)在不同的路徑,數(shù)據(jù)不干擾。

4. 總結(jié)

通過使用接口+本地表的形式來動(dòng)態(tài)控制iOS端表的新增、表結(jié)構(gòu)變更,數(shù)據(jù)的更新。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容