0

我有以下问题:

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

所以,当我从头开始应用程序(没有保存数据等)并添加一个条目时,persistentStore 也被创建,当我单击 tableViewCell 时,我可以将数据保存在这个生成的 persistentStore 中。如果我正在创建一个条目并在单次运行期间观看该条目,这很好用。

如果我关闭应用程序并重新启动,单击同一条目,我会收到以下错误消息:

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

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

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

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

那么,在我添加持久存储之后,如何将持久存储保存到持久存储协调器中呢?

更新:

我想我已经确定了主要问题。第一次运行后,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?

谢谢!

4

5 回答 5

1

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

每次重新启动后,persistentStore 都会发生变化。这是通常的情况吗?

是的!NSPersistentStore 与任何其他对象一样是一个 Objective-C 对象。因此,它在启动过程中并不持久。您需要每次都重新创建它。

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

那么如何设置storeURL变量呢?

于 2011-09-07T11:36:33.937 回答
0

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

这会为您创建一个完整的核心数据堆栈——持久存储、持久存储协调器和托管对象上下文。

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

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

于 2011-09-06T22:23:03.603 回答
0

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

于 2011-09-07T11:16:28.887 回答
0

我想知道问题是否不是核心数据调用,而是如果/何时调用它们?

当您“关闭应用程序并重新启动”时......应用程序是在两者之间终止,还是在后台运行?IIRC 将微妙地影响您的 App Delegate 中调用的内容。根据 WRT Core Data 中事物的排列方式,可能会意外调用(或错过)某些内容。

如果您在 App Delegate(或它们可能位于的任何位置)中跟踪每个单独的与 Core Data 相关的方法,我会很想看看会发生什么,看看您是否可以更直接地抓住它。(如果某处发布了一个最小的测试用例,请分享!)

于 2011-09-07T12:10:29.917 回答
0

这很简单。

重新启动后,我没有addPersistentStoreWithType在尝试从该商店获取数据的视图中进行设置。

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

于 2011-09-07T12:45:13.677 回答