核心数据:持久存储在Xcode中工作,但在设备上不工作

时间:2011-02-25 14:49:44

标签: iphone objective-c xcode core-data

我在iPhone应用程序中使用Core Data。当我在模拟器中使用它时它工作正常但是当我将它部署到设备时,我的应用程序找不到我的Core Data存储的值。如果我在iPhone上插入一个值,它会在Core Data中找到值。

我需要在将其部署到iPhone时保留Core Data的价值。

如果有人知道怎么做,请帮助我。

2 个答案:

答案 0 :(得分:2)

包括应用程序安装在设备上的所有文件必须位于不可更改的应用程序包中,这样才能使文件成为只读文件。

如果您在应用程序包中包含Core Data持久性存储文件,它将驻留在应用程序包中,并且只能作为只读存储添加到持久性存储协调程序中。任何写入它的尝试都会产生错误。

您通常需要一个读写存储,因此解决方案是使用标准文件操作从应用程序包中复制包含的持久存储文件,然后复制到应用程序的Documents或Library文件夹中。当应用程序启动时,应用程序委托会在初始化核心数据堆栈之前检查存储是否存在,如果尚未执行,则将其复制。

您还有一个更高级的选项,即为一个堆栈使用两个存储,一个只读,另一个读写。但是,该方法会在数据模型中引入复杂性,通常不需要。

答案 1 :(得分:1)

这很容易......

  • 准备CoreData数据库文件
  • 将其命名为InitialData.sqlite,例如
  • 将其添加到您的应用程序包

...并在NSPersistentStoreCreation分配&之前添加类似的东西。初始化。

NSString *storePath = ... your store path for persistent store coordinator ...;

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
  NSString *initialStorePath = [[NSBundle mainBundle] pathForResource:@"InitialData" ofType:@"sqlite"];
  if (defaultStorePath) {
    [fileManager copyItemAtPath:initialStorePath toPath:storePath error:NULL];
  }
}

我假设您要将一些默认数据复制到您的应用程序中。这就是我可以从你的问题中推断出来的 - 你还不清楚你真正想要的是什么。