【问题标题】:refresh SQLITE3 (Core Data) on device and app store在设备和应用商店刷新 SQLITE3(核心数据)
【发布时间】:2011-06-06 09:04:58
【问题描述】:

我有一个利用 Core Data SQLITE3 的应用程序,它可以在模拟器中完美运行。但是我不明白如何更新设备上的数据库,我猜这与应用商店中的相同。

我从应用程序中的 .txt 文件更新数据库并创建数据库,此功能仅用于创建数据库,将在最终版本中删除。我的想法是在模拟器中创建数据库,锁定代码的更新部分,然后将包与更新的数据库一起分发。

但是,当我在设备上重建我的应用程序时,它的数据库中仍然有旧数据。

我一直在环顾四周,但恐怕我不完全了解如何解决这个问题。我确实找到了这个帖子:Can't refresh iphone sqlite3 database

如果有好心人能分享一些关于此问题的信息并帮助我解决此问题,我将不胜感激。

干杯

【问题讨论】:

    标签: iphone objective-c core-data sqlite refresh


    【解决方案1】:

    您是否将 db 文件从 bundle 目录(只读)复制到可写目录? (比如每个应用程序的文档目录?)。

    当您尝试在设备中保存时,您是否收到类似这样的 sqlite 错误?

    SQLITE_READONLY     8   /* Attempt to write a readonly database */
    

    编辑:

    主包中的所有文件都是只读的,因此如果您需要修改其中的一个/一些,您需要将文件复制到可写的位置。假设您在这里调用了 db mydb.sqlite,这里有一些将 db(仅当它不存在时)复制到文档目录的代码。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *docDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        NSFileManager *fm = [NSFileManager defaultManager];
        NSString *docPath = [docDirectory stringByAppendingPathComponent:@"mydb.sqlite"];
        if (![fm fileExistsAtPath:docPath]) { // file does not exists, copy it
            NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"sqlite"];
            NSError *error = nil;
            BOOL res = [fm copyItemAtPath:bundlePath toPath:docPath error:&error];
            if (!res) {
                // do something with error
            }
        }
    

    【讨论】:

    • 感谢 Giuliano 的回答,不,我没有,恐怕我不太明白该怎么做?
    【解决方案2】:

    实际上在 Bundle 中使用 .db 文件 - 这是一个非常糟糕的主意。 每次,当我使用 .db 文件时,我都会检查它是否已经存在于我的应用程序文档目录中,然后我会重写它。

        #define DB_SHOULD_BE_REWRITTEN YES //You should update database and change allready existing db file to file from bundle
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSError *error;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
    
    
        BOOL success = [fileManager fileExistsAtPath:writableDBPath];
    
        if (!success || DB_SHOULD_BE_REWRITTEN)
        {
            // The writable database does not exist, so copy the default to the appropriate location.
            NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"];
            success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
            if (!success) {
                NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
            }
        }
    
        dbPath = writableDBPath;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2011-12-30
      相关资源
      最近更新 更多