【问题标题】:iPhone App Store Update System, and the consequences on DatabaseiPhone App Store 更新系统,以及对数据库的影响
【发布时间】:2010-11-11 00:49:44
【问题描述】:

和你们中的许多人一样,我必须在模拟器中删除我的应用程序才能重新安装一个新版本,我会在其中更新我的数据库。否则,无论是否有调试日志,它都会崩溃(如果它是核心数据,调试日志很容易解释)。

我的问题是:因为用户可能不会在通过应用商店更新之前删除他们的应用程序,而且他们肯定会在升级后想要他们的“旧”数据,

我们是否必须开发一个数据库迁移脚本,或者在每次启动时检查 applicationDidLaunch 如果数据库发生变化?

谢谢!

【问题讨论】:

  • 这似乎是一个关于 SQLite 而不是 Core Data 的问题。是吗?
  • 这是一个普遍的问题,因为当时我想知道“应用商店”升级期间发生了什么。我当前的应用正在使用 SQLite

标签: iphone sqlite


【解决方案1】:

如果我的数据在更新后丢失,我肯定会给你一星。
Core-Data 版本控制和迁移在几分钟内完成,至少是轻量级部分。

看看这个answer 和类似的问题

【讨论】:

  • 那我就不告诉你我的应用名称了^^不,说真的,如果我问,那是因为我在乎这种可能性。我一定会检查你的链接,但目前,我将构建一个脚本,因为它是一个 sqlite 应用程序
  • +1 他说的是真的。您不需要(甚至可能无法运行)“脚本”来进行迁移。但是 Core Data 中有一些东西可以帮助您进行这种类型的版本到版本的迁移。是的,如果我拥有你的应用程序并在更新时丢失了我的数据,我会非常生气...... PS不要自动相信以“我没有亲自使用过CoreData所以不知道是否它有专门的工具来处理这个”
  • 我将此问题视为有关迁移处理的一般问题,而不是如何在 CoreData 中完成此操作。但是,由于它有点模棱两可,我在前面加上了“这个答案不适用于 CoreData”的评论。根据 OP 的最后评论,他实际上并没有使用 CoreData。然而你却在听我的回答?
  • 出于礼貌,我将取消它 - 但您如何建议他甚至在 iPhone 上编写迁​​移“脚本”? (P.S. 尝试过 - 但投票被“锁定”,除非您编辑回复。)
  • 我赞成这个答案。公平地说,aepryus 的答案完全适用于我的应用程序:一个基于 sqlite 的应用程序,需要处理多个版本的数据库。我的“脚本”实际上是一些 ALTER 语句的 sqlite3_exec()。对于我使用 Core Data 的其他应用程序,我将查看 fluchtpunkt 链接(再次感谢)
【解决方案2】:

我没有亲自使用过 CoreData,所以不知道它是否有专门的工具来处理这个问题。但是,通常是的,您需要创建和存储 SQL 脚本,以便从您的应用的每个版本迁移到下一个版本。

安装应用时,应根据应用使用的数据模型版本检查数据模型的当前版本。应该有一个“delta”脚本从每个版本移动到每个下一个版本。然后应该应用从当前模型移动到必要模型所需的每个增量。

例如,如果您向 AppStore 提交了 4 个版本。您需要一个 delta 脚本来从版本 1 到 2、从 2 到 3 以及从 3 到 4。

应用程序每次启动时,都会根据可执行文件所需的版本检查数据模型的当前版本。例如,如果设备上安装了版本 4,但用户从未安装过版本 3,则应用程序将启动。检查模型的当前版本,即 2。将其与可执行文件的版本 4 进行比较。然后应用 2 到 3 脚本,然后应用 3 到 4 脚本。

版本号本身可以存储在数据库中,并且应该在应用增量后递增,无论是从增量本身还是在处理代码中自动递增。

增量可以作为常量字符串存储在您的代码文件中,也可以作为资源文件存储在您的项目中。

编辑:(这是我的迁移代码)

+ (NSArray*) chop:(NSString*)sql {
    NSMutableArray* list = [[NSMutableArray alloc] init];
    NSMutableString* sb = [[NSMutableString alloc] init];
    BOOL inside = FALSE;

    for (int i=0;i<[sql length];i++) {
        if ([sql characterAtIndex:i] == '\n') continue;
        if ([sql characterAtIndex:i] == '\r') continue;

        [sb appendFormat:@"%c",[sql characterAtIndex:i]];
        if (!inside) {
            if ([sql characterAtIndex:i] == '\'')
                inside = TRUE;
            else if ([sql characterAtIndex:i] == ';') {
                [sb deleteCharactersInRange:NSMakeRange([sb length]-1,1)];
                [list addObject:sb];
                [sb release];
                sb = [[NSMutableString alloc] init];
            }
        } else {
            if ([sql characterAtIndex:i] == '\'')
                inside = FALSE;
            else if ([sql characterAtIndex:i] == '\\') {
                i++;
                [sb appendFormat:@"%c",[sql characterAtIndex:i]];
            }
        }
    }
    [sb release];
    return [list autorelease];
}

+ (void) updateObjectModel {
    [Log output:@"[migration]"];

    int version;
    @try {
        int exist = [SQL queryLong:@"SELECT COUNT(*) FROM Variables WHERE Key='objectModelVersion'"];
        if (exist)
            version = [SQL retrieveInt:@"objectModelVersion"]+1;
        else {
            [Log output:@"[bootstrapping]"];
            [SQL storeInt:@"objectModelVersion" as:1];
            version = 2;
        }
    } @catch (NSException* e) {
        [Log output:@"[initializing]"];
        version = 0;
    }

    while (TRUE) {
        NSString* filename = [NSString stringWithFormat:@"SQLite-%04d",version];
        NSString* file = [[NSBundle mainBundle] pathForResource:filename ofType:@"sql"];
        if (file) {
            [Log output:[NSString stringWithFormat:@"[%d]",version]];
            NSArray* commands = [SQL chop:[NSString stringWithContentsOfFile:file encoding:NSASCIIStringEncoding error:NULL]];
            for (NSString* command in commands)
                [SQL update:command];
            [SQL storeInt:@"objectModelVersion" as:version];
        } else break;

        version++;
    }
    [Log output:@"[/migration]\n"];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2015-01-10
    • 2010-10-28
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多