如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?
Posted
技术标签:
【中文标题】如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?【英文标题】:How to put a pre-existing sqlite file into <Application_Home>/Library/? 【发布时间】:2012-11-11 21:34:19 【问题描述】:我的应用使用核心数据。我已经在成功创建并填充了相应的 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文件转移到我新创建的'Database'目录下?
非常感谢@Daij-Djan 在下面的回答。
另一个问题: sqlite 文件的路径将由持久存储协调器使用。现在根据 sqlite 文件的大小,复制或移动可能需要一段时间。如何确保@Daij-Djan 提供的示例代码在持久存储协调器尝试引用 sqlite 文件之前已执行并完成?
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:模拟代码
在 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];
....
【讨论】:
如果 OP 不知道如何在Library
中创建子目录以及如何在其中复制默认数据库,那么此伪代码可能无济于事。
大家好!非常感谢。我是 ios 新手。我已经开始从添加的伪代码中研究它。我以为我可以在 Xcode 中完成它,但没有意识到它必须以编程方式完成。另一件事:持久存储协调器将使用 sqlite 文件的路径。现在根据 sqlite 文件的大小,复制或移动可能需要一段时间。在持久存储协调器尝试引用 sqlite 文件之前,如何确保上述示例代码已执行并完成?
在将商店添加到 PST 之前执行此操作。 -> 将代码放在加载 PST 的代码之前
我明白了。我不确定的是:代码执行是否等到对 copyItemAtPath 的调用成功完成后再执行更多代码?如果不是并且 sqlite 文件很大,那么我相信将存储添加到 PST 的调用是可以想象的,即使它是在调用 copyItemAtPAth 之后进行的,仍然可能在复制完全完成之前发生。谢谢。以上是关于如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Sqlite 数据库文件复制/放入设备以在其上测试应用程序 - Xcode