Core-Data: вывод NSLog не показывает "поля"
Я не понимаю вывода 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
содержит всю запись из базы данных, а не отдельные поля. Может быть, для этого мне понадобится 2D-массив, и если да, то как это сделать?
В конечном итоге я хочу сделать цикл по массиву и создать XML-теги для каждого поля. Но шаг за шагом...
Заранее спасибо, Стивен
2 ответа:
Для просмотра отдельных полей объектов в массиве необходимо ссылаться на них напрямую. Вы используете это, чтобы показать объекты в массиве:
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]);
Отображаемые значения будут значениями, возвращаемыми функциями-геттерами каждого объекта, на который вы ссылаетесь в историях.
Вывод, который вы видите, происходит из метода
description
класса NSManagedObject. Это просто удобочитаемый вывод, предназначенный для легкой отладки. Вы не должны использовать его для анализа или хранения данных.Вы не видите никаких подробностей о данных в описании дампа, потому что управляемые объекты были выбраны как "ошибки", что означает, что они просто призрак объектов и не содержат реальных данных. Чтобы получить полноценные объекты немедленно, вы бы установили вас fetch запрос, чтобы сделать это с:
[request setReturnsObjectsAsFaults:NO];
... затем, когда вы регистрируете объекты, вы увидите их данные и связи.
Чтобы действительно использовать данные в атрибутах, вы должны запросить атрибуты напрямую, используя один из методов value, таких как
valueForKey:@"attributeName"
.Правка:
После редактирования вашего вопроса, я думаю, что мне нужно уточнить.
Вы неправильно думаете о базовых данных. Основные данные-это не база данных. У него нет полей. Возвращение выборки запрос-это не таблица.
Элементы реляционной базы данных в основных данных являются совершенно необязательными и скрытыми. Вместо этого, основные данные-это диспетчер графов объектов, который поддерживает целостность отношений между объектами. Данные хранятся в объектах, и при извлечении из постоянного хранилища вы получаете обратно объект, а не поле, столбец или строку.
В этом случае выборка возвращает универсальный 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"]);
Если вы создадите пользовательский подкласс NSManagedObject для сущности
Tabrss
, Вы можете запросить атрибут, непосредственно использующий точечную нотацию:Важно помнить, что вы имеете дело с полноценными объектами, а не с массивами, матрицами, таблицами или какой-то другой тупой структурой данных. Вы получаете данные от каждого отдельного объекта, отправляя сообщение с запросом значения одного из его атрибутов.TabrssSubclass *aTabrss; for (aTabrss in stories) NSLog(@"ATabrss.name=%@",aTabrss.name]);