我有以下问题:
我有一个以 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?
谢谢!