升級要考慮到和前一個版本已經(jīng)存在的文件之間的兼容問題,可以先用舊工程跑一遍,再用新的跑一遍,看有無問題。這是血的教訓?。?!切記
在應用程序更新過程中被保存的文件:
更新應用程序就是將用戶下載的新版應用程序代替之前的版本。在這個過程中,iTunes會將更新過的應用程序安裝到新的應用程序目錄下,并在刪除老版本之前,將用戶數(shù)據(jù)文件轉(zhuǎn)移到新的應用程序目錄下。在更新的過程中,iTunes保證如下目錄中的文件會得以保留:
/Documents
/Library/Preferences
雖然其它用戶目錄下的文件也可能被轉(zhuǎn)移,但是您不應該假定更新之后該文件還仍然存在。
常用目錄:
/AppName.app 這是程序包目錄,包含應用程序的本身。
/Documents/ 您應該將所有的應用程序數(shù)據(jù)文件寫入到這個目錄下。這個目錄用于存儲用戶數(shù)據(jù)或其它應該定期備份的信息。iTunes會備份這個目錄的內(nèi)容。
/Library/Preferences這個目錄包含應用程序的偏好設置文件?! Tunes會備份這個目錄的內(nèi)容。
/Library/Caches這個目錄用于存放應用程序?qū)S玫闹С治募?,保存應用程序再次啟動過程中需要的信息。iTunes不對這個目錄的內(nèi)容進行備份。
/tmp/這個目錄用于存放臨時文件,保存應用程序再次啟動過程中不需要的信息。iTunes不對這個目錄的內(nèi)容進行備份。
App升級時數(shù)據(jù)庫的遷移更新
App 升級時,要考慮到3種情況:
1.App可能會多個賬戶登錄,所以存儲賬戶信息不能用NSUserDefaults要使用數(shù)據(jù)庫來存儲;
2.App內(nèi)如果涉及到一些數(shù)據(jù)沒有和后臺數(shù)據(jù)庫交互,但屬于每個賬戶特有的數(shù)據(jù)(如:帳號,背景皮膚,手勢密碼等等)App退出登錄狀態(tài)時,存儲賬戶信息的數(shù)據(jù)庫不能清空.
但是,一些App運行時的使用的數(shù)據(jù)庫可以清空(如:某一賬戶登錄后,一些界面的網(wǎng)絡數(shù)據(jù)的本地化數(shù)據(jù),在退出登錄時可以把這些數(shù)據(jù)庫清空,當此賬戶再次登錄時可以通過網(wǎng)絡請求再添加,更新等等);
3.當App升級后,本地的數(shù)據(jù)庫是不會被清空的,也不會有變動,但是升級后可能后臺數(shù)據(jù)庫添加了一些字段,而且這些字段影響了參數(shù)的傳遞和UI的展示,我們應該怎么做呢?
我們需要考慮做一個數(shù)據(jù)庫轉(zhuǎn)移模塊,然后按如下步奏:
具體思路
1、在新版本程序里面放入全新設計的數(shù)據(jù)庫。
2、用戶更新程序后打開程序。
3、通過版本判斷之類的功能,運行數(shù)據(jù)轉(zhuǎn)移模塊。把老數(shù)據(jù)庫文件里面的數(shù)據(jù)全部轉(zhuǎn)移到新數(shù)據(jù)庫文件中。
4、轉(zhuǎn)移完畢就可以了。
需要注意的是,設計的時候,這個轉(zhuǎn)移模塊只要運行一次就可以了。
總體方案及思路

流程圖
在每一次運行程序的時候,判斷是否存在數(shù)據(jù)庫,如果不存在則直接創(chuàng)建數(shù)據(jù)庫,若存在取出數(shù)據(jù)庫版本號進行其他的處理.
,當用戶第一次下載安裝app的時候,第一次建立版本庫,將我們的數(shù)據(jù)信息存入數(shù)據(jù)庫中,同時保存一個當前版本號加一的字段到數(shù)據(jù)庫中.
那么問題來了,為什么我們需要將版本信息加一呢,這是為了以后進行版本判斷的時候更加方便.
還有一個問題,為什么我們將版本信息放入數(shù)據(jù)庫而不使用UserDefaults快速存儲呢?原因是你需要考慮到
當你的app有不同的用戶登錄時,UserDefaults是所有數(shù)據(jù)共享的,你不能根據(jù)不同的用戶來處理他的信息
判段他的信息是否需要更新
當用戶更新app的時候,會直接從數(shù)據(jù)庫中取出上一次保存的版本字段,例如是2.0版本的時候,會直接從case2開始執(zhí)行,修改完數(shù)據(jù)結構以后,再一次將版本字段存到數(shù)據(jù)庫中.
所以每更新一次版本,如果數(shù)據(jù)結構信息有變動的時候,直接在后面加case語句即可.
下面是一些參考代碼,使用FMDB庫:
-(instancetype)init
{
//設置數(shù)據(jù)庫版本為1
int dbVersion = 1;
if (self = [super init]) {
//判斷本地有沒有數(shù)據(jù)庫文件
if (![self isExistDB]) {
//不存在 初始化數(shù)據(jù)庫
[self createDB];
}else
{
//如果存在,那么獲取版本信息
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
NSString * currentVersion = [self getDBInfoValue];
dbVersion = currentVersion.intValue;
}
switch (dbVersion) {//判斷版本信息
case 1:
{
//說明用戶第一次安裝1.0版本
//創(chuàng)建版本表
[self excuteLocalSql:createTB_info];
//創(chuàng)建信息表
[self excuteLocalSql:create_tusersql];
//保存1.0+1.0信息到數(shù)據(jù)庫用于下一次判斷版本號
[self setDBInfoValueWithString:@"2.0"];
}
case 2:
{
//更新信息表
[self excuteLocalSql:update_tusersql];
//保存2.0+1.0到數(shù)據(jù)庫
[self setDBInfoValueWithString:@"3.0"];
}
case 3:
[self excuteLocalSql:modify];
[self setDBInfoValueWithString:@"4.0"];
default:
break;
}
}
return self;
}