如何将预先存在的sqlite文件放入<application_home> / Library /?</application_home>

时间:2012-11-11 21:34:19

标签: ios sqlite core-data ios-simulator

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

从阅读文件系统来看,我认为放置sqlite文件的最佳位置是在Application_Home / Library /下的自定义目录“Database”中。我似乎无法在Xcode中执行此操作,尽管搜索我无法弄清楚如何执行以下操作:

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

非常感谢@ Daij-Djan的回答。

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

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

1 个答案:

答案 0 :(得分: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];
    }
    ....
}