[英]Core Data is not persisting data between app launches
我有一个使用核心数据的应用程序。 正在创建核心数据堆栈(上下文,对象图,持久性存储协调器和持久性存储),并且我可以毫无问题地使用它。 问题是保存的数据无法持久保存,有人可以帮我解决我做错的事情吗? 这是我创建核心数据堆栈的地方。
- (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");
});
}
});
}
您必须明确保存核心数据,否则它将不会持久保存。 不过,这并不难解决。
在控制器实现文件(例如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();
}
}
}
我的个人经验是,即使您调用了[moc save:error],在从Xcode->构建并在设备上运行应用程序时,也可能找不到保存的内容。 但是,如果停止Xcode运行该应用程序,然后通过单击“应用程序图标”从设备启动该应用程序,则该内容实际上将保留下来。
只是我通过反复试验发现的个人经验,希望您能看到同样的事情。
您必须保存MOC。
[mom save:nil];
这里有些事情对我来说很奇怪。 首先,为什么要穿线创建NSPersistentStore
? 通常,我创建NSPersistentStoreCoordinator
,添加NSPersistentStore
,然后创建上下文。 除非您有充分的理由,否则我建议您以该顺序进行。 尽管没有特别禁止,但是在创建NSManagedObjectContext
之后,添加NSPersistentStore
可能会遇到问题。
我不确定是否需要它,但是我一直明确地强烈引用NSPersistentStoreCoordinator
。 同样,创建多个上下文也很有用。 我建议在您的代码中这样做。
正如其他所有人所说,您还需要显式保存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.