【问题标题】:CoreData Basics HelpCoreData 基础帮助
【发布时间】:2010-11-29 17:47:21
【问题描述】:

编辑: 我已按照建议更改了 NSPredicate,以便我的获取代码看起来像这样。像这样打印到 UITextView 后,当我按下加载时,它会吐出以下内容:

<NSManagedObject: 0x1c7cf0>(entity: DatedText; id: 0x1420c0 <x - coredata://B52D4F88-0210-4AE2-9DA6-C05ED64FE389/DatedText/p12> ; data: <fault>)

所以要么它没有获取任何数据数据,因为它没有正确保存/加载,要么我试图以不正确的方式将加载的结果放入 UITextView。有什么想法吗?

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    NSEntityDescription *testEntity = [NSEntityDescription entityForName:@"DatedText" inManagedObjectContext:self.managedObjectContext];
    [fetch setEntity:testEntity]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"dateSaved == %@", datePicker.date];
    [fetch setPredicate:pred];

    NSError *fetchError = nil;
    NSArray *fetchedObjs = [self.managedObjectContext executeFetchRequest:fetch error:&fetchError];
    if (fetchError != nil) {
        NSLog(@" fetchError=%@,details=%@",fetchError,fetchError.userInfo);
        return nil;
    }
    NSString *object = [NSString stringWithFormat:@"%@",[fetchedObjs objectAtIndex:0]];
    noteTextView.text = object;

我在研究如何使用 Core Data 时遇到了各种各样的问题,所以我回到了基础,使用核心数据的基于新窗口的 ipad 项目。

我添加了一个视图和一些不起作用的代码,呵呵。我基本上试图将一些文本保存到一个日期,然后当回到那个日期时,之前保存的文本将再次显示。

【问题讨论】:

  • 哪位不起作用?它崩溃了吗?或者只是不做你期望的?您是否尝试过调试器并设置断点?即在采取各种步骤后设置断点,然后查看变量并确保它们包含您期望的内容。把你的发现放在这里,我会回来再看看。
  • 项目先生:mediafire.com/?1x77zf8x21i84d1 随意看看。我发现它在到达时崩溃:NSArray *fetchedObjs = [self.managedObjectContext executeFetchRequest:fetch error:&amp;fetchError]; in loadNotes
  • 不要只是(再次)将人们指向您的项目,而是描述您遇到的问题或您对此的疑问。
  • 另外,您应该描述实际的崩溃,而不仅仅是说它崩溃。这样可以更轻松地帮助人们。
  • 您在发布问题时应该更加具体,至少包括您收到的错误消息。不过,我已经查看了您的项目,并且在下面的回答中概述了解决方案。

标签: iphone objective-c ipad core-data uidatepicker


【解决方案1】:

在 iPhone 开发者网站here 上有一个教程。还有几个sample codes 与Core Data 一起使用。这些应该让你开始。

【讨论】:

    【解决方案2】:

    我检查了您的项目,除了必须合成 CoreData 属性之外,我还注意到您试图将 NSArray 分配给您的 fetch 谓词,但它实际上需要一个 NSPredicate 对象。你应该改用这个:

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(dateSaved == %@)", datePicker.date];
    [fetch setPredicate:pred];
    

    如果你想设置超过 1 个谓词,你应该在你的谓词字符串上这样做,即

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(dateSaved == %@) AND (dateSaved <= %@", datePicker.date, [NSDate date]];
    

    干杯, 罗格

    【讨论】:

    • 这确实阻止了它在该行的失败,谢谢!但是我现在的问题是从数组中获取对象并将该文本放入 UITextView。请检查原始帖子,有趣的错误。
    • 这不是错误。如果要获取保存对象的文本值,需要使用 noteTextView.text = [[fetchedObjs objectAtIndex:0] valueForKey:@"savedText"];
    【解决方案3】:

    您很可能会崩溃,因为您的 ivar 是 managedObjectContext_,但您使用的是 self.managedObjectContext。即使您提供自定义 getter,您也需要合成核心数据 ivars。

    【讨论】:

    • 我之前尝试过使用managedObjectContext_,但没有成功,也没有在合成核心数据变量之后。
    【解决方案4】:

    您将 NSFetchRequest 的谓词设置为 NSArray,而不是 NSPredicate。

    如果您发布了实际的崩溃,它可能会说类似未知选择器被发送到 NSArray 的实例。

    【讨论】: