未保存到核心数据数据库的对象

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

新上下文的意义何在?你想用这段代码解决什么问题?

【讨论】:

以上是关于未保存到核心数据数据库的对象的主要内容,如果未能解决你的问题,请参考以下文章

保存核心数据对象后,UISplitView 详细信息未更新

更改未保存在核心数据模型中(例如删除对象)

ios核心数据未保存

核心数据数据未保存

核心数据一对多关系未正确/按预期保存

保存已编辑的核心数据实体未保存