使用 NSFetchedResultsController 更新 CoreData 对象

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 更新 CoreData 对象【英文标题】:Update CoreData Objects with NSFetchedResultsController 【发布时间】:2015-04-01 13:31:11 【问题描述】:

我制作了一个使用 Core Data 并获取结果控制器的应用程序。

我可以添加 CoreData 对象,也可以删除它们。现在我想通过获取的结果控制器更新一个 CoreData 对象。我知道我必须获取对象然后我可以更改它。但是因为我还在学习,所以我不知道该怎么做。现在我想请教您如何做到这一点?

【问题讨论】:

【参考方案1】:

当您从 CoreData 获取时,如果您修改结果,它将在您保存时更新 CoreData 中的实际值。

您需要先执行提取:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObejctContext:moc]];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// error handling code

获得结果后,您可以修改各个记录...

MyEntity *entity = [results objectAtIndex:0];
entity.title = @"updated attribute";
// save context
[moc save:&error];

编辑:在swift中,它将类似于以下内容:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
var moc = appDelegate.managedObjectContext!

var fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName("Entity", inManagedObjectContext: moc)

var error: NSError?
var results = moc.executeFetchRequest(fetchRequest, error: &error)

// error handling code

var entity: MyEntity = MyEntity()
entity.title = "updated attribute"

moc.save(&error)

【讨论】:

感谢您的回答。如何在 Swift 中做到这一点? 我更新了答案以包含快速代码。我没有过多地使用 Swift,但它应该与我发布的内容非常相似。 你可以添加let appDelegate = UIApplication.sharedApplication() as AppDelegate; var moc = appDelegate.managedObjectContext!; 抱歉,我跳过了那部分......我应该包括它 我收到此错误:'UIApplication' is not convertible to 'AppDelegate' 和此错误:Use of undeclared type 'MyEntity' 我猜测这个错误,但请确保您使用的是UIApplication.sharedApplication().delegate。此外,MyEntity 只是您可以从 CoreData 使用的可能实体的一个示例。您需要将该部分替换为您在 CoreData 模型中定义的实际 CoreData 实体和属性。这是一个很好的教程:jamesonquave.com/blog/core-data-in-swift-tutorial-part-1

以上是关于使用 NSFetchedResultsController 更新 CoreData 对象的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?