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