4

我的应用程序使用核心数据。我已经在模拟器中运行了该应用程序,该应用程序已成功创建并填充了相应的 sqlite 文件。我现在想将这个预先存在的 sqlite 文件放到实际设备上并成为我应用程序的一部分。我在 /Library/Application Support/iPhone Simulator/6.0/Applications/identifier/Documents/myapp.sqlite 找到了模拟器生成的 sqlite 文件并将其拖到 Xcode 中。这已将其添加到我的应用程序包中,但不在适当的目录中(结果是可以读取 sqlite 文件但不能写入)。

通过阅读有关文件系统的信息,我相信放置 sqlite 文件的最佳位置是在 Application_Home/Library/ 下的自定义目录“数据库”中。我似乎无法在 Xcode 中执行此操作,尽管进行了搜索,但我无法弄清楚如何执行以下操作:

(1) 在 Application_Home/Library/ 中创建一个名为“Database”的子目录?(2) 将 sqlite 文件传输到我新创建的“数据库”目录?

非常感谢@Daij-Djan 他在下面的回答。

另一个问题:持久存储协调器将使用 sqlite 文件的路径。现在根据 sqlite 文件的大小,复制或移动可能需要一段时间。在持久存储协调器尝试引用 sqlite 文件之前,如何确保 @Daij-Djan 提供的示例代码已经执行并完成?

感谢您提前提供任何帮助。

4

1 回答 1

4

模拟代码

在 appDidFinishLaunching.. 也许

dbpath = PATH_YOU_WANT
if(!file.exists_at:dbpath) {
    copy(dbinbundle, dbpath);
}

在 objC 中:(内联编写,错别字/错误的可能性)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    NSString *lib = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbs = [lib stringByAppendingPathComponent:@"Database"];
    NSString *file = [dbs stringByAppendingPathComponent:@"db.sqlite"];
    if(![[NSFileManager defaultManager] fileExistsAtPath:file]) {

        id dbInBundle = [[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"];

        [[NSFileManager defaultManager] createDirectoryAtPath:dbs withIntermediateDirectories:YES attributes:nil error:nil];
        [[NSFileManager defaultManager] copyItemAtPath:dbInBundle toPath:file error:nil];
    }
    ....
}
于 2012-11-11T21:37:17.640 回答