Core-Data: вывод NSLog не показывает «поля» - PullRequest
5 голосов
/ 24 июня 2010

Я не понимаю вывод 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 ]

14 голосов
/ 26 июня 2010

Вывод, который вы видите, получен из description метода класса NSManagedObject.Это просто удобочитаемый вывод, предназначенный для облегченных целей отладки.Вы не должны использовать его для анализа или хранения данных.

Вы не видите никаких подробностей о данных в дампе описания, потому что управляемые объекты были выбраны как "ошибки", что означает, что они являются просто призраком объектов и не содержат реальных данных.Для немедленной выборки полноценных объектов вы должны задать запрос на выборку следующим образом:

[request setReturnsObjectsAsFaults:NO];

... затем, когда вы зарегистрируете объекты, вы увидите их данные и связи.

Чтобы фактически использовать данные в атрибутах, необходимо запросить атрибуты напрямую, используя один из методов значений, например valueForKey:@"attributeName".

Редактировать:

После редактированияВаш вопрос, я думаю, мне нужно уточнить.

Вы думаете о Базовых Данных все неправильно.Базовые данные не являются базой данных.У него нет полей.Возврат запроса на выборку не является таблицей.

Элементы реляционной базы данных в Базовых данных являются совершенно необязательными и скрытыми.Вместо этого Core Data - это менеджер графов объектов, который поддерживает целостность отношений между объектами.Данные хранятся в объектах, и при извлечении из постоянного хранилища вы получаете объект, а не поле, столбец или строку.

В этом случае выборка возвращает универсальный 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 для *С сущностью 1035 * вы можете запросить атрибут напрямую, используя точечную запись:

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

Важно помнить, что вы имеете дело с полноценными объектами, а не с массивами, матрицами, таблицами или какой-либо другой тупой структурой данных.Вы получаете данные от каждого отдельного объекта, отправляя сообщение с запросом значения одного из его атрибутов.

6 голосов
/ 24 июня 2010

Чтобы просмотреть отдельные поля объектов в массиве, вы должны ссылаться на них напрямую. Вы используете это, чтобы показать объекты в массиве:

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]);

Отображаемыми значениями будут значения, возвращаемые функциями получения каждого объекта, на который вы ссылаетесь в журналах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...