iPhone/iPad应用开发数据库升级

来源:互联网 发布:网络案件的侦查取证 编辑:程序博客网 时间:2024/04/29 00:16

APP开发技术QQ群:347072638


为什么数据库要升级?

由于需求变动或增加,原来的数据库结构设计不满足现有的需求(当然,如果一开始就考虑到了,那数据库升级就是多此一举了)。



数据库升级的对象?
1、用户已经在使用旧产品,新产品需要更新的情况下(前提是用户不删除App,而是直接通过AppStore update)。
2、第一次下载安装此app不需要升级(知道为什么的话,请看后面)。
3、删除App,重新下载安装的不需要升级,理由如2。



难点?

版本比较多,升级次数比较多,用户使用的版本不确定,需要一步一步升级上去。



如何实现?
首先要知道用户当前使用的是哪一个版本,这个没办法,只有保存旧版本号才能实现。,然后在升级时读出旧版本号,判断旧版本是处在那一个升级处,然后在执行以上升级处的sql脚本。
每次升级都有对应的脚本,如果 从低版本升级到高版本时每一个脚本都要跑一遍(这就有一个问题,要花时间,让用户等待。此时还要考虑如果用户突然中断升级怎么办?断电,内存不足,手按Home键等)。



代码示例

    //如果DB不存在,直接返回
    //判断第一次安装
    NSUserDefaults *userDefaults =  [NSUserDefaults standardUserDefaults];
    if (!dba._bIsExistDB) {
        NSString *version = [pVersionArray lastObject];
        [userDefaults setObject:version forKey:@"old_version"];
        [userDefaults synchronize];
        return YES;
    }
    
    //DB存在,是否要进行数据库升级
    NSString *version =    [pVersionArray lastObject];
    NSString *oldVersion = [userDefaults objectForKey:@"old_version"];

    if (![version isEqualToString:oldVersion]) {
        [self upGradeDB];
        [userDefaults setObject:version forKey:@"old_version"];
        [userDefaults synchronize];
    }


-(void)upGradeDB
{
    SEL pfunc1 = @selector(upgrade200);
    NSNumber *num1 = [[NSNumber alloc] initWithInt:(int)pfunc1];
    NSArray *_pArraAyFun = [NSArray arrayWithObjects:num1, nil];
    [num1 release];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *oldVersion = [userDefaults objectForKey:@"old_version"];
    NSInteger nCurrect = [pVersionArray count];
    if ([oldVersion isKindOfClass:[NSNull class]]
        || oldVersion == nil
        || [oldVersion isEqualToString:@""]) {
        nCurrect = 0;
    }else
    {
        NSInteger i = 0;
        for (NSString *version in pVersionArray) {
            if ([version isEqualToString:oldVersion]) {
                nCurrect = i;
                nCurrect ++;
                break;
            }
            i++;
        }
        if (i >= [pVersionArray count]) {
            //根据版本号来调整当前最接近哪个版本
            nCurrect = i;
        }
    }
    for (NSInteger index = nCurrect; index < [pVersionArray count]; index++) {
        SEL pFunc = (SEL)[[_pArraAyFun objectAtIndex:index] intValue];
        [self performSelector:pFunc];
    }
}


- (void)upgrade200
{
    //升级脚本
}