前一段時(shí)間在進(jìn)行App升級(jí)的時(shí)候,由于一開(kāi)始版本初期沒(méi)有考慮完善,導(dǎo)致走了很多彎路,后來(lái)經(jīng)過(guò)自己的一些思考,總結(jié)出了一些在app升級(jí)的時(shí)候,數(shù)據(jù)庫(kù)內(nèi)文件同步保持更新的經(jīng)驗(yàn),希望能給大家?guī)?lái)幫助.
總體方案及思路
在每一次運(yùn)行程序的時(shí)候,判斷是否存在數(shù)據(jù)庫(kù),如果不存在則直接創(chuàng)建數(shù)據(jù)庫(kù),若存在取出數(shù)據(jù)庫(kù)版本號(hào)進(jìn)行其他的處理.
,當(dāng)用戶第一次下載安裝app的時(shí)候,第一次建立版本庫(kù),將我們的數(shù)據(jù)信息存入數(shù)據(jù)庫(kù)中,同時(shí)保存一個(gè)當(dāng)前版本號(hào)加一的字段到數(shù)據(jù)庫(kù)中.
那么問(wèn)題來(lái)了,為什么我們需要將版本信息加一呢,這是為了以后進(jìn)行版本判斷的時(shí)候更加方便.
還有一個(gè)問(wèn)題,為什么我們將版本信息放入數(shù)據(jù)庫(kù)而不使用UserDefaults快速存儲(chǔ)呢?原因是你需要考慮到
當(dāng)你的app有不同的用戶登錄時(shí),UserDefaults是所有數(shù)據(jù)共享的,你不能根據(jù)不同的用戶來(lái)處理他的信息
判段他的信息是否需要更新當(dāng)用戶更新app的時(shí)候,會(huì)直接從數(shù)據(jù)庫(kù)中取出上一次保存的版本字段,例如是2.0版本的時(shí)候,會(huì)直接從case2開(kāi)始執(zhí)行,修改完數(shù)據(jù)結(jié)構(gòu)以后,再一次將版本字段存到數(shù)據(jù)庫(kù)中.
所以每更新一次版本,如果數(shù)據(jù)結(jié)構(gòu)信息有變動(dòng)的時(shí)候,直接在后面加case語(yǔ)句即可.
下面是一些參考代碼,使用FMDB庫(kù):
/**
* 1.當(dāng)沒(méi)有數(shù)據(jù)庫(kù)存在的時(shí)候,創(chuàng)建數(shù)據(jù)庫(kù) 然后執(zhí)行版本1的創(chuàng)建(創(chuàng)建版本表,創(chuàng)建信息表),保存1.0+1.0信息到版本庫(kù),數(shù)據(jù)庫(kù)內(nèi)版本號(hào)為2.0
2.當(dāng)有數(shù)據(jù)庫(kù)存在的時(shí)候,執(zhí)行判斷版本庫(kù)的版本信息,版本號(hào)賦值給dbVersion,然后進(jìn)行信息的更新,同時(shí)更新版本號(hào)的更新
*/
-(instancetype)init
{
//設(shè)置數(shù)據(jù)庫(kù)版本為1
int dbVersion = 1;
if (self = [super init]) {
//判斷本地有沒(méi)有數(shù)據(jù)庫(kù)文件
if (![self isExistDB]) {
//不存在 初始化數(shù)據(jù)庫(kù)
[self createDB];
}else
{
//如果存在,那么獲取版本信息
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
NSString * currentVersion = [self getDBInfoValue];
dbVersion = currentVersion.intValue;
}
switch (dbVersion) { //判斷版本信息
case 1:
{
//說(shuō)明用戶第一次安裝 1.0版本
//創(chuàng)建版本表
[self excuteLocalSql:createTB_info];
//創(chuàng)建信息表
[self excuteLocalSql:create_tusersql];
//保存1.0+1.0信息到數(shù)據(jù)庫(kù) 用于下一次判斷版本號(hào)
[self setDBInfoValueWithString:@"2.0"];
}
case 2:
{
//更新信息表
[self excuteLocalSql:update_tusersql];
//保存2.0+1.0到數(shù)據(jù)庫(kù)
[self setDBInfoValueWithString:@"3.0"];
}
case 3:
[self excuteLocalSql:modify];
[self setDBInfoValueWithString:@"4.0"];
default:
break;
}
}
return self;
}```
使用的方法:
//使用的SQL語(yǔ)句
static NSString *createTB_info=@"create table if not exists t_info (version text)";
static NSString *create_tusersql = @"CREATE TABLE IF NOT EXISTS T_User (userid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, username TEXT, usergender TEXT, usercreatetime date, userupdatetime date,age INTEGER,islogined INTEGER)";
static NSString * update_tusersql = @"alter table T_User add column useraddress TEXT";
static NSString *modify=@"alter table T_User add column password text not null default '111111'";
//判斷是否存在數(shù)據(jù)庫(kù)
-(BOOL)isExistDB
{
NSFileManager *fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:[self getDBPath]];
}
//得到路徑
-(NSString *)getDBPath
{
return [NSString stringWithFormat:@"%@/Documents/user1.sqlite",NSHomeDirectory()];
}
pragma mark - 更新版本號(hào)
-(BOOL)updateVersionInfoWithString:(NSString *)version
{
NSString *sql = @"UPDATE t_info SET version = ?";
BOOL b = [_dataBase executeUpdate:sql,version];
return b;
}
pragma mark - 插入版本號(hào)
-(BOOL)insertVersionInfoWithString:(NSString *)version
{
NSString *sql = @"INSERT INTO t_info(version) VALUES(?)";
BOOL b = [_dataBase executeUpdate:sql,version];
return b;
}
pragma mark - 創(chuàng)建版本信息
- (BOOL)setDBInfoValueWithString:(NSString *)string
{
if ([self getDBInfoValue]) {
//更新版本
[self updateVersionInfoWithString:string];
}
else
{
//插入版本
[self insertVersionInfoWithString:string];
}
return YES;
}
//得到版本信息
-
(NSString *)getDBInfoValue
{
NSString *sql = @"select version from t_info";
//注意 需要先打開(kāi)數(shù)據(jù)庫(kù)
[_dataBase open];
FMResultSet *resultSet = [_dataBase executeQuery:sql];NSString * version = nil;
while ([resultSet next]) {
version = [resultSet stringForColumn:@"version"];
}
return version;
}
pragma mark - 創(chuàng)建數(shù)據(jù)庫(kù)中的表
- (BOOL)excuteLocalSql:(NSString *)createTB_info
{
BOOL b = [_dataBase executeUpdate:createTB_info];
NSLog(@"表的創(chuàng)建結(jié)果:%d",b);
return b;
}
pragma mark - 初始化數(shù)據(jù)庫(kù)
- (void)createDB
{
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
if (_dataBase.open == YES) {
NSLog(@"數(shù)據(jù)庫(kù)成功創(chuàng)建!");
}else
{
NSLog(@"創(chuàng)建失敗!");
}
}```
如果覺(jué)得對(duì)自己有幫助的話,請(qǐng)點(diǎn)贊噢!
有什么疑問(wèn)和問(wèn)題可以直接私信我.