来自下载的sqlite的iPhone核心数据upsert

时间:2010-06-24 05:11:10

标签: iphone iphone-sdk-3.0 core-data

我想介绍我的核心数据应用程序下载新的sqlite文件并更新其存储数据的功能。请注意,数据模型没有变化。

首先,我并不担心用户对存储数据的更改,只是想覆盖它。

  • 我发现存储数据更新的唯一方法是更改​​sqlite文件的名称..?
  • 是否有通过核心数据合并2个sqlite文件的标准方法?从而保持用户修改数据。
  • 更新(下载的sqlite文件)是否可以作为已发布的核心数据sqlite的子集?请注意,sqlite包含二进制信息。

我认为this SO question在回答这些问题时不尽如人意。

感谢您的指导!

2 个答案:

答案 0 :(得分:0)

如果要在不修改现有数据库的情况下更新任何数据库文件,则必须按此实现

- (void)applicationDidFinishLaunching:(UIApplication *)application {

[self createEditableCopyOfDatabaseIfNeeded];

}

- (void)createEditableCopyOfDatabaseIfNeeded {

    // First, test for existence - we don't want to wipe out a user's DB

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *documentDirectory = [self applicationDocumentsDirectory];

    NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"DataBaseName.sqlite"];

    BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath];

    if (!dbexits) {

        // The writable database does not exist, so copy the default to the appropriate location.
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DataBaseName.sqlite"];

        NSError *error;
        BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {

            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);

        }

    }

}

答案 1 :(得分:0)

我知道这是一个老问题,但在自己解决这个问题后,我只想补充以下几点:

  • 核心数据存储的默认sqlite文件yourProjectName.sqlite似乎受到保护。覆盖它不起作用。您需要执行上面提到的raaz并创建副本。
  • 创建副本后,您可以轻松覆盖该文件。但是,其他答案中的一些建议表明,覆盖核心数据sqlite文件的最佳方法是首先删除它。这不适用于设备!它抛出一个错误,说它无法删除该文件。它可以在模拟器中工作,但不能在设备上工作(在4.2上的3G上测试)
  • 因此,最好的方法是覆盖文件,而不是删除文件并创建新文件。
  • 当然,请务必先从持久性商店协调员处删除商店!

我的2c,希望它有所帮助。