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

Ste*_*hen 5 arrays iphone core-data nsmanagedobject nsmanagedobjectcontext

我不理解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.");
}
Run Code Online (Sandbox Code Playgroud)

日志文件内容:

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.
Run Code Online (Sandbox Code Playgroud)

这是什么意思?:

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

我想实际从数据库中看到该字段的内容.

我的数据库中有15条记录,每条记录中有12条记录.从我的基本理解来看,我的stories数组看起来像是从数据库而不是单个字段中保存整个记录.也许我需要一个2D数组才能实现这一目标,如果是这样,我该怎么做呢?

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

斯蒂芬,提前谢谢

Tec*_*Zen 14

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

您没有在描述转储中看到有关数据的任何详细信息,因为托管对象被提取为"故障",这意味着它们仅仅是对象的重影并且不包含实际数据.要立即获取完整的成熟对象,您可以设置获取请求以执行此操作:

[request setReturnsObjectsAsFaults:NO];
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

编辑完问题后,我想我需要详细说明.

你在想Core Data都错了.核心数据不是数据库.它没有字段.获取请求的返回不是表.

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

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

假设您的Tabrss实体具有name属性.要获取获取中的每个名称,Tabrss您将使用:

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

或者让它更明确:

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

如果为Tabrss实体创建自定义NSManagedObject子类,则可以使用点表示法直接查询属性:

TabrssSubclass *aTabrss;
for (aTabrss in stories)
    NSLog(@"ATabrss.name=%@",aTabrss.name]);
Run Code Online (Sandbox Code Playgroud)

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


NWi*_*kie 6

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

NSLog (@"Element %i = %@", i, [stories objectAtIndex: i]);
Run Code Online (Sandbox Code Playgroud)

当您使用%@时,NSLog会生成每个对象的描述,这通常是错综复杂或无用的.如果你想看到里面的字段尝试这样的事情:

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

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