【问题标题】:Saving and Deleting NSManagedObject & NSManagedObjectContext保存和删除 NSManagedObject & NSManagedObjectContext
【发布时间】:2013-02-14 01:34:11
【问题描述】:

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

我有以下代码允许我访问 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。即用户有一个他在场景之间填写的表格。当用户点击导航控制器上的 Next 按钮时,每个场景的所有内容都会保存到 CoreData。经过几个屏幕后,用户想要取消表单。在这一点上,我想删除到目前为止已保存的所有内容。请提供代码示例。

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

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

【问题讨论】:

    标签: ios core-data fetch save nsfetchrequest


    【解决方案1】:
    1. 要删除,您只需从NSManagedObjectContext 中删除letsMeet 对象。

      NSError *error;
      [managedObjectContext deleteObject:letsMeet];
      [managedObjectContext save:&error];

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

    2.如果LetsMeet实体被建模为所有表单元素都是LetsMeet的属性,当你像在代码中那样创建LetsMeet对象后保存managedObjectContext时,这将被保存作为单个对象。

    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 是唯一的,这将返回一个对象数组。

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

    更新: 获取 NSManagedObject 的 objectId:

     [letsMeet objectId];
    

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

    【讨论】:

    • 谢谢拉克什。这里很晚了,我会在上午试一试。随着我继续构建应用程序,我将添加更多对象。我会在上午通知你。顺便说一句,我还没有弄清楚如何获取objectID。
    • 至于#3,我想在对象完成后继续保存它们,并根据时间戳将它们拉到 UItableview 中。所以当你说我只会有一个对象时,你的意思是在 managedObjectContext 中有一个对象吗?可能是我混淆了两者。当前对象将是用户将在 objectArray[0] 上工作的对象。其他对象将是在用户完成表单时将被保存并在 UItableview 中显示为历史记录的对象。我希望我说得通。谢谢。
    • 您只能通过 managedObjectContext 访问您的核心数据对象。执行获取请求后,resultArray[0] 将是数组中的唯一对象,这将是您要获取的对象。根据您的评论而不是 formId/objectId,您将使用时间戳来执行提取。要按日期设置谓词,请看这里stackoverflow.com/questions/1965331/…
    • 我已更新答案以包含有关托管对象上下文的更多说明。但是从您的问题来看,我觉得您对核心数据的一些基本概念并不熟悉,也许您应该先阅读苹果参考。
    • 感谢您的解释。我正在编写我的第二本核心数据书。我理解这些概念,但只需要一些澄清。我计算了数组中的对象,有 56 个!即使每次跑步我都可能完成了整个表格两次。因此,我只需要在用户保存表单时坚持,如果用户没有完成完整的表单,我需要删除对象。但后来我回到我的老问题是如何从一个场景到另一个场景访问相同的 NSManagedObject。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多