未保存到核心数据数据库的对象
Posted
技术标签:
【中文标题】未保存到核心数据数据库的对象【英文标题】:Objects Not Being Saved to Core Data Database 【发布时间】:2014-01-03 23:11:17 【问题描述】:我正在尝试使用以下代码将对象添加到核心数据数据库:
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
managedObjectContext.persistentStoreCoordinator = [[CoreDataController sharedCoreDataController] persistentStoreCoordinator];
Feed *feed = [NSEntityDescription insertNewObjectForEntityForName:@"Feed" inManagedObjectContext:managedObjectContext];
feed.feedID = dictionary[@"feed_id"];
feed.siteURL = dictionary[@"site_url"];
feed.title = dictionary[@"title"];
NSError *error;
if (![managedObjectContext save:&error])
NSLog(@"Error, couldn't save: %@", [error localizedDescription]);
Feed 是 NSManagedObject 的子类。从 sharedCoreDataController(单例)返回的 persistentStoreCoordinator 是来自 UIManagedDocument(在应用程序启动时创建或打开)的 persistentStoreCoordinator。据我所知,文档正在成功创建或打开。我在模拟器中运行此代码,并且正在查看保存数据库的目录(apps Documents 目录),但没有更新 persistentStore 文件以反映正在添加的新对象。难道我做错了什么?我还应该指出,上面的代码在一个并发的异步队列上被执行了多次。
任何帮助将不胜感激,在此先感谢。
更新:根据 Alexander 和 Duncan 的建议,上面的代码已更新以反映更改。然而遗憾的是,我没有注意到任何区别(新数据没有出现在persistentStore 文件中)。
【问题讨论】:
你在哪里调用保存? 如果我是你,我会避免创建 managedObjectContext 的多个实例。 @Paul.s 我没有意识到我必须这样做。 :) 我已经尝试添加 Alexander 和 Duncan 提到的以下几行,但遗憾的是它似乎没有奏效。我的印象是 UIManagedDocument 自动保存。 您在尝试保存数据时是否出现控制台错误?也许您正在尝试不正确地设置属性值,或者您没有设置必需的值? @viperking 控制台没有错误,也不需要任何属性。 【参考方案1】:您是否拨打了电话以保存您的managedObjectContext
?这个怎么样:
NSError *error;
if (![managedObjectContext save:&error])
NSLog(@"Error, couldn't save: %@", [error localizedDescription]);
【讨论】:
【参考方案2】:尝试使用类似的东西
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
managedObjectContext.persistentStoreCoordinator = [[CoreDataController sharedCoreDataController] persistentStoreCoordinator];
for (NSDictionary *dictionary in arrayOfData)
Feed *feed = [NSEntityDescription insertNewObjectForEntityForName:@"Feed" inManagedObjectContext:managedObjectContext];
feed.feedID = dictionary[@"feed_id"];
feed.siteURL = dictionary[@"site_url"];
feed.title = dictionary[@"title"];
NSError *error;
if (![managedObjectContext save:&error])
NSLog(@"Error, couldn't save: %@", [error localizedDescription]);
我会避免为您插入的每个对象创建 managedObjectContext。
【讨论】:
【参考方案3】:首先,不推荐使用UIManagedDocument
。它不打算成为您的单个应用程序范围的上下文。它适用于文档样式应用程序。
其次,从UIManagedDocument
暴露的NSManagedObjectContext
没有附加NSPersistentStoreCoordinator
。它是私有NSManagedObjectContext
的子上下文,然后具有NSPersistentStoreCoordinator
。我怀疑如果您使用调试器,您可能会发现您的NSManagedObjectContext
缺少它的NSPersistentStoreCoordinator
。
无论如何,您都在使用UIManagedDocument
,然后尝试将另一个NSManagedObjectContext
附加到同一个NSPersistentStoreCoordinator
。这是一个糟糕的设计,您至少应该删除UIManagedDocument
或停止创建新的NSManagedObjectContext
。
新上下文的意义何在?你想用这段代码解决什么问题?
【讨论】:
以上是关于未保存到核心数据数据库的对象的主要内容,如果未能解决你的问题,请参考以下文章