5

我不理解 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 标记。但是一步一步...

在此先感谢,斯蒂芬

4

2 回答 2

14

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

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

[request setReturnsObjectsAsFaults:NO];

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

要实际使用属性中的数据,您必须使用其中一种值方法直接查询属性,例如valueForKey:@"attributeName".

编辑:

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

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

The relational database elements in Core Data are utterly optional and hidden. Instead, Core Data is an object graph manager that maintains the integrity of relationships between objects. The data is stored in objects and when you fetch from the persistent store you get back an object, not a field, column or row.

In this case, the fetch is returning a generic NSManagedObject that is configured to represent an entity Tabrss in your entity graph. Each managed object instance represents one logical Tabrss object. To get any value from from any Tabrss object you ask the managed object for the value associated with the name of the attribute of the Tabrss entity.

Suppose your Tabrss entity has a name attribute. To get the name of every Tabrss in your fetch you would use:

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

Or making it more explict:

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

If you make a custom NSManagedObject subclass for the Tabrss entity you can query the attribute directly using the dot notation:

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

The important thing it to remember you are dealing with full fledged objects and not arrays, matrixes, tables or some other dumb data structure. You get the data from from each individual object by sending a message asking for the value of one its attributes.

于 2010-06-26T17:09:59.313 回答
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 函数返回的值。

于 2010-06-24T13:51:44.580 回答