繁体   English   中英

从下载的sqlite中获取iPhone核心数据更新

[英]iPhone core data upsert from downloaded sqlite

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

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

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

我认为这个SO问题不足以回答这些问题。

感谢您的指导!

如果要更新任何数据库文件而不修改现有数据库,则必须执行以下操作

- (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]);

        }

    }

}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM