2013-02-28 73 views
3

三个问题,但它们都是相关的。如果你喜欢我可以把它们分成三个问题,这样你可以获得更多的学分。让我知道你是否希望我这样做。保存和删除NSManagedObject&NSManagedObjectContext

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

问题2:让我们说用户打开窗体的结尾并决定保存窗体供以后检索。如何将整个表单的副本保存为核心数据中的一个对象。代码示例请。

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

回答

3
  1. 要删除只是需要从NSManagedObjectContext删除letsMeet对象。

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

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

更新: 要获得NSManagedObject的OBJECTID:

[letsMeet objectId]; 

ManagedObjectContext就像一个白板。数组中的对象,托管对象上下文中的对象,它们都是相同的。您可以更改对象,添加对象,删除对象等。只有当您执行写入磁盘的[managedObjectContext save:]时,对象的当前状态才是。

+0

谢谢拉克什。它在这里迟到了,我会在AM上演这一幕。在继续构建应用程序时,我将添加更多对象。我会在上午通知你。顺便说一句,我还没有想出如何获得objectID呢。 – user1107173 2013-02-28 04:59:06

+0

至于#3,我希望在完成时保存对象,并在基于Timestamp的UItableview中将它们拉起来。所以当你说我只有一个对象时,你的意思是managedObjectContext中的一个对象吗?可能是我混淆了这两个。当前对象将是用户将在objectArray [0]上工作的对象。其他对象将是在用户完成表单时将保存的对象,并显示为UItableview中的历史记录。我希望我有道理。谢谢。 – user1107173 2013-02-28 05:53:14

+0

您只能通过managedObjectContext访问核心数据对象。在执行提取请求之后,resultArray [0]将是数组中唯一的对象,并且将是您要提取的对象。根据您的评论而不是formId/objectId,您将使用时间戳执行获取。按日期设置谓词看这里http://stackoverflow.com/questions/1965331/nspredicate-filtering-objects-by-day-of-nsdate-property。 – Rakesh 2013-02-28 11:50:07

相关问题