保存和加载数据 - CoreData

4
我是CoreData的新手,在我的iPhone应用程序中,我想知道如何保存一些文本,然后将其加载回来。但是诀窍在于,在UIDatePicker中的日期与我保存它时相同时将其加载回来,就像一个日历。
更新
感谢回复,特别是代码示例。但是我有一些问题不太理解如何将它们组合在一起,请原谅我。我想学习这是如何工作的,但同时让它工作真的会很有帮助。
我是否应该将您的第一段代码放在did finish editing方法中(离开文本框时保存),然后将第二段代码放在date changed方法中(更改日期时加载)?
这段代码使用实体和属性名称吗?我需要如何设置我的xcdatamodel文件?我需要使用此代码还是只需演示我需要哪些实体和属性?
DatedText{
    savedText:String
    dateSaved:Date
}

这一行代码显示'mo'未声明:(已修复)

    newDatedText=mo=[NSEntityDescription insertNewObjectForEntityForName:@"DateText"
inManagedObjectContext:theManagedObjectContext];

假设下面的'someText'是我想要保存的文本?而'aDateObject'则是我的UIDatePicker中的日期?

[newDatedText setValue:someText forKey:@"savedText"];
    [newDatedText setValue:aDateObject forKey:@"dateSaved"];

在非结构体或联合体中请求成员“moc”:

NSEntityDescription *testEntity=[NSEntityDescription entityForName:@"DatedText" inManagedObjectContext:self.moc];

“targetDate”是什么(未声明)?又是UIDatePicker日期吗?
NSPredicate *pred=[NSPredicate predicateWithFormat:@"dateSaved==%@", targetDate];

在不是结构体或联合体的东西中请求成员“moc”:

NSArray *fetchedObjs=[self.moc executeFetchRequest:theFetch error:&fetchError];

“newDatedText=mo=” 是我回答中的一个打字错误,现已更正。 - TechZen
好的,我以为可能是这样。但我仍然不理解一些事情:http://b.imagehost.org/0718/Screen_shot_2010-11-17_at_22_59_14.png - Josh Kahane
1
你一直试图直接复制和粘贴示例代码到你的项目中。这样是行不通的。我们无法访问你的项目,因此无法创建与你分配的变量名相匹配的变量。我们只能使用虚构的名称,比如DatedTexttargetDate。你应该将这些虚构的变量名更改为与你的项目相匹配的变量名。 - TechZen
哦,我明白了,抱歉,我只是想弄清楚他们所代表的东西。 - Josh Kahane
2个回答

3

首先,你需要一个数据模型来反映你想要保存的内容,本例中是一些文本和日期。所以:

DatedText{
    savedText:String
    dateSaved:Date
}

创建一个新的DatedText对象(不使用自定义类),请执行以下操作:
NSManagedObject *newDatedText;
newDatedText=[NSEntityDescription insertNewObjectForEntityForName:@"DateText" inManagedObjectContext:theManagedObjectContext];
[newDatedText setValue:someText forKey:@"savedText"];
[newDatedText setValue:aDateObject forKey:@"dateSaved"];

NSError *saveError=nil;
[theManagedObjectContext save:&saveError];
if (saveError!=nil) {
    NSLog(@"[%@ saveContext] Error saving context: Error=%@,details=%@",[self class], saveError,saveError.userInfo);
}

为了获取一个指定日期的DatedText对象,您可以创建如下的fetch:
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
NSEntityDescription *testEntity=[NSEntityDescription entityForName:@"DatedText" inManagedObjectContext:self.moc];
[fetch setEntity:testEntity]; 
NSPredicate *pred=[NSPredicate predicateWithFormat:@"dateSaved==%@", targetDate];
[fetch setPredicate:[NSArray arrayWithObject:pred]];

NSError *fetchError=nil;
NSArray *fetchedObjs=[theManagedObjectContext executeFetchRequest:theFetch error:&fetchError];
if (fetchError!=nil) {
    NSLog(@" fetchError=%@,details=%@",fetchError,fetchError.userInfo);
    return nil;
}

fetchedObjs 现在将包含与 targetDate 相同的 savedDate 的所有 DatedText 对象的数组。


谢谢您的回复和出色的代码示例!我遇到了一些问题并编辑了我的原始帖子,您能看一下吗? - Josh Kahane
在看了很多不同的代码并与之交互后,回到这里时,它变得更加清晰了。然而,关于托管对象上下文,有一件事情我不太明白。它是从哪里来的?我只需要声明一个吗?还是更复杂一些?而“theFetch”不就是你声明为“fetch”的东西吗? - Josh Kahane
使用Xcode模板项目之一创建一个基于Core Data的应用程序。在应用程序委托类中,它将提供方法来展示如何设置Core Data栈。 - TechZen

3

这就是提供链接而不是代码示例的问题所在。第一个链接已经失效了。 - Houman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接