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ù)同步步驟
- 獲取iOS端數(shù)據(jù)庫中的
TableVersion表配置的每張表信息,調(diào)用CheckUpdate接口,獲取需要更新的數(shù)據(jù)表信息(表名、表結(jié)構(gòu)版本、表數(shù)據(jù)版本)。 - 在獲取的數(shù)據(jù)表信息里面,對(duì)比表的表結(jié)構(gòu)版本與iOS端
TableVersion中對(duì)應(yīng)表的表結(jié)構(gòu)版本,如果需要更新則調(diào)用FetchSchema接口更新對(duì)應(yīng)表的表結(jié)構(gòu)。(SQLite只允許表新增字段,無法刪除表字段) - 調(diào)用FetchData來獲取每張表需要更新的表數(shù)據(jù),使用
replace into語句來進(jìn)行更新。 - PostData接口用來向服務(wù)器上傳新數(shù)據(jù)或者更改的數(shù)據(jù),
Timestamp值由后臺(tái)生成。
2.4 同步補(bǔ)充
- 在設(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ù)的目的。 -
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ù)的更新。