核心数据:NSLog输出不显示“字段”

5

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

我正在读取我的数据库,并将内容放入一个数组中,循环遍历该数组,然后使用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标记。但是一步一步来...
谢谢您提前的帮助,Stephen。

3
“我不太理解输出结果” - 你不理解输出结果的哪个部分? - Georg Fritzsche
这是什么意思:<NSManagedObject:0x3b3dcb0>(实体:Tabrss;id:0x3b06a60 x-coredata://5B703215-A7D8-4E42-834E-A721D78E84BE/Tabrss/p22;数据:<fault>我想实际查看数据库字段的内容。 我的数据库中有15条记录,每条记录有12个字段。从我的基本理解来看,似乎我的STORIES数组保存了来自数据库的整个记录,而不是单个字段。也许我需要一个二维数组来完成这个任务,如果是这样,我该如何做? - Stephen
我认为他非常清楚地表明了自己不理解的地方,用了“这是什么意思?”这句话。他正在寻找数值,但得到了指向内存空间的指针。没必要让他感觉更像个新手,我们都是从头开始的。 - Michael Morrison
2个回答

14
你看到的输出来自NSManagedObject类的“description”方法。它只是一个人类可读的输出,旨在用于轻量级调试目的。你不应该实际使用它来解析或存储数据。
你在描述转储中看不到任何关于数据的细节,因为受管对象被作为“faults”获取,这意味着它们只是对象的幽灵,并不包含真正的数据。要立即获取完整的对象,可以将提取请求设置为如下方式:
[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时,我自然而然地开始使用我熟悉的术语。当我的应用程序完成后,我计划回到起点并重新审查一切。再次感谢您的帮助。 - Stephen
是的,有扎实数据库经验的人通常比新手更难学习核心数据。这只是自然而然地以你已经了解的知识为基础进行思考。 - TechZen

6

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

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函数返回的值将显示在屏幕上。

1
谢谢您的回复,您能否详细说明一下getIntegerField和getStringField?我收到了一个错误,指出找不到这些方法。这是我需要编写的代码吗? - Stephen
1
抱歉,我应该更具体一些。那些本应是通用的getter方法,因为我对NSManagedObject类不是很熟悉。应该有一些方法来检索存储在NSManagedObject中的信息并解释它,然后您可以使用嵌套方法格式来输出该信息。例如,如果您想返回实体“Tabrss”,则会使用[[stories objectAtIndex:i] entity]。但我不太确定最初遗漏了哪些信息。 - NWilkie

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