3

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

我有以下代码允许我访问 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 中检索保存的对象并显示所有用户保存的内容?请提供代码示例。

4

1 回答 1

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

    NSError *error;
    [managedObjectContext deleteObject:letsMeet];
    [managedObjectContext save:&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 是唯一的,这将返回一个对象数组。

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

更新: 获取 NSManagedObject 的 objectId:

 [letsMeet objectId];

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

于 2013-02-28T02:37:51.077 回答