我有一个使用核心数据的应用。正在创建Core Data堆栈(上下文,对象图,持久性存储协调器和持久性存储),并且我能够毫无问题地使用它。问题是保存的数据不是持久的,有人可以帮我解决我做错的事吗?这是我创建核心数据堆栈的地方。
- (void)initializeCoreDataStack
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Favorites"
withExtension:@"momd"];
if (!modelURL)
NSLog(@"MODEL URL NOT INITIALIZED");
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
if (!mom)
NSLog(@"OBJECT MODEL NOT CREATED");
NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
if (!psc)
NSLog(@"PERSISTENT STORE COORDINATOR NOT CREATED");
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
self.managedObjectContext = moc;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSArray *directory = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask];
NSURL *storeUrl = [directory lastObject];
storeUrl = [storeUrl URLByAppendingPathComponent:@"Favorites.sqlite"];
NSError *error = nil;
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:nil
error:&error];
if (!store)
{
NSLog(@"ERROR CREATING STORE: %@ %@", error.localizedDescription, error.domain);
// present error to user
}
else
{
dispatch_sync(dispatch_get_main_queue(), ^{
// do something once the stack is finished being created
NSLog(@"persistent store created");
});
}
});
}
答案 0 :(得分:3)
您必须明确保存核心数据,否则它将不会持久存在。但不难解决。
在您的控制器实现文件(例如coreDataViewController.m)中,如果要保存对核心数据的更改,请调用此函数
// add this call, whenever you want to save data
// e.g. responding to a UIButton event
[self saveCoreDataContext];
- (void)saveCoreDataContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
答案 1 :(得分:1)
我个人的经验是,即使您拨打[moc save:error],您也可能无法找到从Xcode运行应用程序时保存的内容 - >在设备上构建和运行。但是,如果您停止运行应用程序的Xcode,并通过单击应用程序图标从设备启动应用程序,则内容实际上是持久的。
我通过反复试验找到的个人经历,希望你看到同样的事情。
答案 2 :(得分:0)
您必须保存MOC [妈妈保存:零];
答案 3 :(得分:-1)
这里有一些东西对我来说很奇怪。首先,为什么要线程创建NSPersistentStore
?通常,我创建NSPersistentStoreCoordinator
,添加NSPersistentStore
,然后创建上下文。我建议按顺序这样做,除非你有充分的理由不这样做。虽然没有明确禁止,但在NSPersistentStore
创建后添加NSManagedObjectContext
时可能会遇到问题。
我不确定是否需要,但我总是明确强烈提及NSPersistentStoreCoordinator
。创建多个上下文也很有用。我建议你在代码中这样做。
正如其他人所说,你还需要明确保存。