【问题标题】:Core-Data: NSLog output Does Not Show "Fields"核心数据:NSLog 输出不显示“字段”
【发布时间】:2011-03-07 17:27:04
【问题描述】:

我不理解 NSFetchRequest 返回的数组的 NSLog 输出。

我正在读取我的数据库并将内容放入一个数组中,循环遍历该数组,然后使用 NSLog 输出内容。我不太明白日志文件中的输出。代码如下:

-(void)createXMLFeed{
    //Fetch details from the database.
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tabrss" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    NSError *error;
    self.stories = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    //[request release];

    // Count the number of items in the array and display in the log.
    int arrayItemQuantity = [stories count];
    NSLog(@"Array Quantity: %d", arrayItemQuantity);

    // Loop through the array and display the contents.
    int i;
    for (i = 0; i < arrayItemQuantity; i++)
        NSLog (@"Element %i = %@", i, [stories objectAtIndex: i]);

    [stories release]; 

    // Update log file.
    NSLog(@"Database read and XML feed created.");
}

日志文件内容:

2010-06-24 10:09:56.918 TAB RSS[998:207] Array Quantity: 15
2010-06-24 10:09:56.919 TAB RSS[998:207] Element 0 = <NSManagedObject: 0x3b3dcb0> (entity: Tabrss; id: 0x3b06a60 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p22> ; data: <fault>)
2010-06-24 10:09:56.920 TAB RSS[998:207] Element 1 = <NSManagedObject: 0x3b3e1c0> (entity: Tabrss; id: 0x3b14720 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p23> ; data: <fault>)
2010-06-24 10:09:56.920 TAB RSS[998:207] Element 2 = <NSManagedObject: 0x3b3e370> (entity: Tabrss; id: 0x3b1ebd0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p24> ; data: <fault>)
2010-06-24 10:09:56.921 TAB RSS[998:207] Element 3 = <NSManagedObject: 0x3b3e4e0> (entity: Tabrss; id: 0x3b1ecd0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p25> ; data: <fault>)
2010-06-24 10:09:56.921 TAB RSS[998:207] Element 4 = <NSManagedObject: 0x3b3e660> (entity: Tabrss; id: 0x3b3b3f0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p26> ; data: <fault>)
2010-06-24 10:09:56.922 TAB RSS[998:207] Element 5 = <NSManagedObject: 0x3b3e7d0> (entity: Tabrss; id: 0x3b09d20 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p27> ; data: <fault>)
2010-06-24 10:09:56.922 TAB RSS[998:207] Element 6 = <NSManagedObject: 0x3b3e940> (entity: Tabrss; id: 0x3b3cf20 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p28> ; data: <fault>)
2010-06-24 10:09:56.924 TAB RSS[998:207] Element 7 = <NSManagedObject: 0x3b3eac0> (entity: Tabrss; id: 0x3b3cf30 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p29> ; data: <fault>)
2010-06-24 10:09:56.924 TAB RSS[998:207] Element 8 = <NSManagedObject: 0x3b3ec40> (entity: Tabrss; id: 0x3b3cf40 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p30> ; data: <fault>)
2010-06-24 10:09:56.925 TAB RSS[998:207] Element 9 = <NSManagedObject: 0x3b3edb0> (entity: Tabrss; id: 0x3b3cf50 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p31> ; data: <fault>)
2010-06-24 10:09:56.925 TAB RSS[998:207] Element 10 = <NSManagedObject: 0x3b3ef20> (entity: Tabrss; id: 0x3b3cf60 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p32> ; data: <fault>)
2010-06-24 10:09:56.926 TAB RSS[998:207] Element 11 = <NSManagedObject: 0x3b3f090> (entity: Tabrss; id: 0x3b3cf70 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p33> ; data: <fault>)
2010-06-24 10:09:56.926 TAB RSS[998:207] Element 12 = <NSManagedObject: 0x3b3f200> (entity: Tabrss; id: 0x3b3cf80 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p34> ; data: <fault>)
2010-06-24 10:09:56.927 TAB RSS[998:207] Element 13 = <NSManagedObject: 0x3b3f380> (entity: Tabrss; id: 0x3b3cf90 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p35> ; data: <fault>)
2010-06-24 10:09:56.927 TAB RSS[998:207] Element 14 = <NSManagedObject: 0x3b3f500> (entity: Tabrss; id: 0x3b3cfa0 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p36> ; data: <fault>)
(gdb) continue
2010-06-24 10:09:57.932 TAB RSS[998:207] Database read and XML feed created.

这是什么意思?:

<NSManagedObject: 0x3b3dcb0> (entity: Tabrss; id: 0x3b06a60 <x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p22> ; data: <fault> 

我想实际查看数据库中字段的内容。

我的数据库中有 15 条记录,每条记录中有 12 个字段。从我的基本理解来看,我的 stories 数组似乎保存了数据库中的整个记录​​,而不是单个字段。也许我需要一个二维数组来完成这个,如果是这样,我该怎么做?

最终我想遍历数组并为每个字段创建 XML 标记。但是一步一步...

提前致谢,斯蒂芬

【问题讨论】:

  • “我不太明白输出” - 你不明白它的哪一部分?
  • 这是什么意思: (entity: Tabrss; id: 0x3b06a60 ; 数据: 我想真正从数据库中查看字段的内容。我的数据库中有 15 条记录,每条记录中有 12 个字段。根据我的基本理解,看起来我的 STORIES 数组保存了数据库中的整个记录,而不是单个字段。也许我需要一个二维数组来完成这个,如果是这样,我该怎么做???
  • 我认为他很清楚他用“这是什么意思?”这句话表达了他不理解的内容。他正在寻找值并获得指向内存空间的指针。没有必要让他感觉自己更像个菜鸟,我们都是从头开始的。

标签: iphone arrays core-data nsmanagedobject nsmanagedobjectcontext


【解决方案1】:

要查看数组中对象的各个字段,您必须直接引用它们。您正在使用它来显示数组中的对象:

NSLog (@"Element %i = %@", i, [stories objectAtIndex: i]);

当你使用 %@ 时,NSLog 会生成每个对象的描述,这通常是令人费解或无用的。如果您想查看里面的字段,请尝试以下操作:

NSLog (@"Element %i contains fields: %d - %s - %d",i,[[stories objectAtIndex: i] getIntegerField],[[stories objectAtIndex: i] getStringField],[[stories objectAtIndex: i] getAnotherIntegerField]);

显示的值将是您在故事中引用的每个对象的 getter 函数返回的值。

【讨论】:

  • 感谢您的回复,您能否详细说明一下getIntegerField、getStringField。我收到一条错误消息,指出找不到这些方法。这是我必须编码的东西吗??
  • 抱歉,我应该更具体一些。这些应该是通用的 getter 方法,因为我对 NSManagedObject 类不是很熟悉。应该有一些方法可以检索存储在 NSManagedObject 中的信息并对其进行解释,然后您可以使用嵌套方法格式来输出该信息。例如,如果您想返回实体“Tabrss”,您将使用 [[stories objectAtIndex:i] entity]。不过,我不太确定最初遗漏了哪些信息。
【解决方案2】:

您看到的输出来自 NSManagedObject 类的 description 方法。它只是用于轻量级调试目的的人类可读输出。您不应该实际使用它来解析或存储数据。

您在描述转储中看不到有关数据的任何详细信息,因为托管对象是作为“故障”提取的,这意味着它们只是对象的幽灵,不包含真实数据。要立即获取完整的对象,您可以将获取请求设置为:

[request setReturnsObjectsAsFaults:NO];

...然后,当您记录对象时,您将看到它们的数据和关系。

要实际使用属性中的数据,必须直接使用valueForKey:@"attributeName"等值方法之一查询属性。

编辑:

编辑您的问题后,我想我需要详细说明。

您对 Core Data 的看法完全错误。 Core Data 不是数据库。它没有字段。获取请求的返回不是表。

Core Data 中的关系数据库元素是完全可选且隐藏的。相反,Core Data 是一个对象图管理器,它维护对象之间关系的完整性。数据存储在对象中,当您从持久存储中获取时,您会得到一个对象,而不是字段、列或行。

在这种情况下,获取将返回一个通用 NSManagedObject,该对象被配置为在您的实体图中表示一个实体 Tabrss。每个托管对象实例代表一个逻辑Tabrss 对象。要从任何Tabrss 对象中获取任何值,您需要向托管对象询问与Tabrss 实体的属性名称相关联的值。

假设您的Tabrss 实体具有name 属性。要在您的 fetch 中获取每个 Tabrss 的名称,您可以使用:

int i;
for (i = 0; i < arrayItemQuantity; i++)
    NSLog (@"Element %i = %@", i, [[stories objectAtIndex: i] valueForKey:@"name"]);

或者让它更明确:

NSManagedObject *aTabrss;
for (aTabrss in stories)
    NSLog(@"aTabrss.name=%@",[aTabrss valueForKey:@"name"]);

如果您为 Tabrss 实体创建自定义 NSManagedObject 子类,您可以使用点符号直接查询属性:

TabrssSubclass *aTabrss;
for (aTabrss in stories)
    NSLog(@"ATabrss.name=%@",aTabrss.name]);

重要的是要记住,您处理的是完整的对象,而不是数组、矩阵、表格或其他一些愚蠢的数据结构。您可以通过发送一条询问其属性值的消息从每个单独的对象中获取数据。

【讨论】:

  • 感谢这篇文章,我现在才回来阅读它。我设法让我的项目的这一部分工作。另外,感谢您对 Core Data 的解释。我对 iPhone 开发非常陌生,但在过去几个月中学到了很多东西。我有很强的编程背景,所以当我看到 Core Data 时,我自然而然地开始使用我熟悉的术语。当我的应用程序完成后,我计划回到开始并查看所有内容。再次感谢您的帮助。
  • 是的,拥有扎实 DB 经验的人通常比新手更难学习 Core Data。根据您已经知道的内容进行思考是很自然的。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 2014-02-07
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多