如何保存PersistentStore

时间:2011-09-06 22:17:24

标签: ios core-data persistent-storage persistent-data

我遇到以下问题:

我有一个以UITableView作为根视图的应用程序。在这个tableView中是不同的条目和每个条目(可以由用户创建)我还在我的应用程序中添加了一个持久化存储。

因此,当我从头开始应用程序(没有保存数据等)并添加条目时,也会创建persistentStore,当我单击tableViewCell时,我可以在此生成的persistentStore中保存数据。如果我正在创建一个条目并且在一次运行期间观察该条目,这可以正常工作。

BUT

如果我关闭应用程序并再次启动,请单击相同的条目,我收到以下错误消息:

NSFetchRequest *allUsers = [[NSFetchRequest alloc] init];
[allUsers setAffectedStores:[NSArray arrayWithObject:[[self.tableViewContext persistentStoreCoordinator] persistentStoreForURL:storeURL]]];

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSArray initWithObjects:count:]:尝试在对象[0]上插入nil对象

所以似乎我想要添加一个实际为零的商店,因为(我想是这样)系统在这个给定的storeURL下找不到任何商店(这与我在商店中创建商店的商店相同)第一次运行。)

所以我猜在第二次运行中不存在persistentStore,因此在创建它的第一次运行中它没有正确保存。

那么在我添加之后,如何将persistentStore保存到persistentStoreCoordinator?

更新

我想我已经确定了主要问题。第一次运行后,persistentStoreCoordinator已更改。那么在关闭应用程序之前如何保存所有这些东西(managedObjectContext,persistentStoreCoordinator)?

有人能帮助我吗?

更新2

以下是我创建商店的方式:

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString* storeFileName = [NSString stringWithFormat:@"%@",newItem.name];
    NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:storeFileName]];                            
     NSError* saveToStoreError;
    if(![[self.addContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&saveToStoreError]){
     NSLog(@"Error: %@, %@", saveToStoreError, [saveToStoreError userInfo]);
     abort();
    }
    else
    {
      NSError *saveStoreError;
      if(![self.addContext save:&saveStoreError])
      {
           NSLog(@"Saving Data wasn't possible!");
      }
    }

更新3 所以,经过大量测试后,我的结果是:

  • 商店的创建工作正常。我可以创建多个商店,只要我在我的应用程序中运行,我就可以访问和填充它们。

因此重启我的应用程序会发生变化。我认为错误必须与managedObjectContext,persistentStoreCoordinator或商店的SAVING相关联。

我是否应该更改应用委托中的任何设置以设置managedObjectContext或persistentStoreCoordinator?

谢谢!

5 个答案:

答案 0 :(得分:1)

你表达问题的方式让我怀疑某种混乱。

  

每次重启后persistentStore都在变化。这是通常的情况吗?

是的! NSPersistentStore是任何其他对象的Objective-C对象。因此,它不会在发布之间持久存在。您需要每次都重新创建它。

NSPersistentStore的持久性是指向它的文件。但是每次运行应用程序时,都必须重新创建一个新的NSPersistentStore对象,可能使它指向同一个文件(由url的{​​{1}}参数定义。)

那么如何设置initWithPersistentStoreCoordinator:configurationName:URL:options:变量?

答案 1 :(得分:0)

在Xcode模板中查看基于Window的应用程序。

这将为您创建一个完整的Core-Data堆栈 - 持久存储,持久存储协调器和托管对象上下文。

假设您的应用程序没有特别要求它,您应该只有一个持久存储。实际上,这是写入数据的文件。查看代码,每次保存数据时,您都会尝试创建自己的商店。

您应该从我上面建议的模板中复制核心数据堆栈方法。您不需要自己引用持久性存储或持久性存储协调器。您只需要应用程序委托创建的托管对象上下文。

答案 2 :(得分:0)

要保存托管对象上下文,请在添加新的持久性存储库&之后使用NSManagedObjectContext的“save:”方法。在关闭应用程序之前。然后,要检查是否正确添加了持久存储,请使用NSPersistentStoreCoordinator“persistentStores”方法来确定可用的有效存储。

答案 3 :(得分:0)

我想知道问题不是核心数据的调用,而是在何时/何时被调用?

当你“关闭应用程序然后重新开始”时...应用程序在两者之间终止,还是背景化? IIRC将巧妙地影响您的App Delegate中调用的内容。根据WRT核心数据的排列方式,可能会意外地调用(或遗漏)。

如果您在App Delegate中找到每个单独的Core Data相关方法(或者他们可能位于何处),我会很高兴看到会发生什么,看看你是否能够更加热情地抓住它。 (如果在某处发布了最小的测试用例,请分享!)

答案 4 :(得分:0)

这很简单。

在我尝试从此商店获取数据的视图中,我没有在重启后设置addPersistentStoreWithType

对不起这篇文章。简单易行;-) bangingmyheadonthewall