ios - 保存和删除 NSManagedObject 和 NSManagedObjectContext

标签 ios core-data fetch save nsfetchrequest

三个问题,但它们都是相关的。如果你愿意,我可以把它们分成三个问题,这样你就可以获得更多的学分。如果您想让我这样做,请告诉我。

我有以下允许我访问 NSManagedObject 的代码

self.managedObjectContext = [(STAppDelegate *)[[UIApplication sharedApplication]  delegate] managedObjectContext];

NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext]];
NSArray *objectArray = [managedObjectContext executeFetchRequest:request error:&error];
if(objectArray.count==0){
    letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
    } else{
    letsMeet = (LetsMeet *)[objectArray objectAtIndex:0];
    }

上面的代码允许我保存和检索属性。即我可以访问 letsMeet.attribute 来保存和获取。

问题 1:如何删除并启动一个全新的 managedObjectContext。即用户有一个他在场景之间填写的表格。当用户点击导航 Controller 上的下一步按钮时,每个场景的所有内容都会保存到 CoreData。经过几个屏幕后,用户想要取消表单。在这一点上,我想删除迄今为止保存的所有内容。请代码示例。

问题 2:假设用户接近表单末尾并决定保存表单以供以后检索。如何将整个表单的副本保存为 Core Data 中的一个对象。请代码示例。

问题 3:稍后如何从 Core Data 中检索保存的对象并显示所有用户保存的内容?请代码示例。

最佳答案

  1. 要删除,您只需从 NSManagedObjectContext 中删除 letsMeet 对象。

    NSError *错误;
    [managedObjectContext deleteObject:letsMeet];
    [managedObjectContext 保存:&error];

因为你总是只有一个对象,所以获取 letsMeet 的引用不是问题。您可以像在代码中那样做。
更新: 而且您不需要删除托管对象上下文。它只是一个处理您的对象的空间。问题末尾有更多解释。

2. 如果 LetsMeet 实体的建模方式是所有表单元素都是 LetsMeet 的属性,则在创建 managedObjectContext 后保存LetsMeet 对象,就像您在代码中所做的那样,这将保存为单个对象。

3.您已经知道如何检索对象,因为这就是您在代码中所做的事情。一切都变得简单,因为您只使用一个对象。 在多个对象获取唯一对象的情况下,您应该实现一个主键(可能是 formID,即;向 LetsMeet 添加另一个属性)或者您应该知道每个对象的 objectId 是什么是然后相应地设置您的提取请求的谓词。

NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:letsMeet];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"formId like %@", formId];
[request setPredicate:predicate];

NSArray *resultsArray =[managedObjectContext executeFetchRequest:request error:&error];

如果您的 formId 是唯一的,这将返回一个对象数组。

但是,如果您使用核心数据来仅处理一个对象,则可以使用 NSUserDefaults 或写入 plist 文件来执行此操作。这有点矫枉过正。

更新: 获取 NSManagedObject 的 objectId:

 [letsMeet objectId];

ManagedObjectContext 就像一 block 白板。数组中的对象,托管对象上下文中的对象,都是一样的。您可以更改对象、添加对象、删除对象等。唯一的问题是当您执行 [managedObjectContext save:] 时对象的当前状态,即写入磁盘。

关于ios - 保存和删除 NSManagedObject 和 NSManagedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125734/

相关文章:

ios - 过滤关系 Coredata 的子项而不是父项

Swift 将删除的行保存到核心数据

javascript - Fetch 不发送发布数据

javascript - 如何防止 react-query 最初获取但启用重新获取?

ios - 应用程序 WidgetKit 描述和名称本地化

iphone - UITabBarViewController 崩溃

iphone - Objective C中变量位置的声明/定义?

ios - 为什么 UICollectionView 的 didSelect 方法不起作用?

swift - 核心数据 - 如何从实体属性中获取最大值(Swift)

javascript - 试图将 jquery AJAX 转换为 Fetch API,如何设置 RequestHeader?