我不理解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
数组看起来像是从数据库而不是单个字段中保存整个记录。也许我需要一个2D数组才能实现这一目标,如果是这样,我该怎么做呢?
最终我想遍历数组并为每个字段创建XML标记。但是一步一步......
先谢谢,斯蒂芬
答案 0 :(得分:14)
您看到的输出来自NSManagedObject类的description
方法。它只是一个人类可读的输出,用于轻量级调试。您不应该实际使用它来解析或存储数据。
您没有在描述转储中看到有关数据的任何详细信息,因为托管对象被提取为“故障”,这意味着它们仅仅是对象的重影并且不包含实际数据。要立即获取完整的成熟对象,您可以使用以下命令设置获取请求:
[request setReturnsObjectsAsFaults:NO];
...然后当您记录对象时,您将看到他们的数据和关系。
要实际使用属性中的数据,您必须使用其中一种值方法直接查询属性,例如valueForKey:@"attributeName"
。
编辑完问题后,我想我需要详细说明。
你认为核心数据都错了。核心数据不是数据库。它没有字段。获取请求的返回不是表。
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"]);
或者让它更明确:
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]);
重要的是要记住你正在处理完整的对象,而不是数组,矩阵,表格或其他一些愚蠢的数据结构。您可以通过发送询问其属性值的消息来从每个对象获取数据。
答案 1 :(得分: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函数返回的值。