insertNewObjectForEntityForName:inManagedObjectContext:仅在初始化NSFetchedResultsController后有效

时间:2014-08-07 23:04:43

标签: ios core-data ios7.1

我正在使用Xcode 5和iOS SDK 7.1。

我有UITableViewController NSFetchedResultsController,这是从Apple" Master-Detail Application"模板。在UITableViewController内一切正常。我有另一个具有相同上下文的视图控制器,它将新的托管对象插入到UITableViewController表中。如果我在通过另一个视图控制器插入对象之前加载UITableViewController至少一次,一切正常,但如果我在之前插入一个对象,我加载UITableViewController它是不知何故失去了。我是这样插入对象的:(我使用&#34创建了MyEntity;编辑器 - >创建NSManagedObject子类")

MyEntity *myEntity = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext:context];

myEntity.field1 = value1;
myEntity.field2 = value2;

if (![context save:error])
    return nil;

并且保存成功返回,但由于某种原因,我插入的对象永远丢失!我一直在谷歌搜索类似的东西,但没有找到任何东西。在对行为进行一些研究后,我发现初始化NSFetchedResultsController就足够了:(从Apple的模板中复制)

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:20];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"MyEntities"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

并保留对它的引用。只要有对已初始化的NSFetchedResultsController的引用,我就可以插入对象并插入它们。

除非我在这里遗漏了一些基本的东西,否则这是令人费解的行为!

请帮帮我..

1 个答案:

答案 0 :(得分:0)

每当您使用Table View Controller和Core Data时,始终建议使用Fetched Results Controllers,它们将使开发变得更加容易。

提取结果控制器的工作方式与表视图相同。两者都有部分和行。获取的结果控制器可以从托管对象上下文中读取托管对象,并将它们分成多个部分和行。每个部分都是一个组(如果您指定它),并且部分中的每一行都是一个托管对象。然后,您可以轻松地将此数据映射到表格视图并将其显示给用户。

在托管对象上下文中创建获取的结果控制器后,任何更改(插入,删除,修改等)也将立即反映在获取的结果控制器上。例如,您可以创建获取的结果控制器以读取Person实体的托管对象。然后在应用程序的其他位置,您可以将新的MyEntity托管对象插入上下文(创建获取结果控制器的相同上下文)。立即,新的托管对象将在获取的结果控制器中可用。这真是太神奇了!

提取结果控制器与表视图完全相同,因为它们具有部分和行,如前所述。您可以使用获取的结果控制器轻松地在应用程序的GUI中显示托管对象。