Базовые данные не возвращают свойство NSMutableArray - PullRequest
0 голосов
/ 29 августа 2010

Я начинаю чувствовать себя довольно глупо - я просмотрел сайт и обнаружил несколько вещей, которые приближаются к моей проблеме, но просто не могу понять это (помогите М. Зарре, после прочтения вашей книги я чувствовал себя довольно хорошо о Core Data, но теперь я нахожусь в тупике!). Несмотря на совет эксперта, я решил сохранить NSMutableArray как трансформируемый атрибут в моей основной сущности данных. Сам массив заполняется пользовательскими объектами и имеет требуемые методы encodeWithCoder: и initWithCoder:. Я добавил туда NSLogs, чтобы посмотреть, когда они стреляют.

Теперь, при первом запуске, заполнении всего и т. Д. Все в порядке, и я сохраняю все при выходе (я вижу в файле XML, что код был закодирован.)

Однако при перезапуске, извлечении NSManagedObject и последующей попытке доступа к трансформируемому атрибуту я ничего не получаю обратно - несмотря на операторы журнала, указывающие, что initWithCoder: работал успешно. Это как если бы декодирование выполнялось как часть выборки NSManagedObject, но сам атрибут не заполняется (я пробовал все, включая setReturnsObjectsAsFaults: No). Печать описания объекта показывает 'priceData - "(... not nil ...)", поэтому я действительно не знаю, почему тогда он не разрешает доступ / ничего не возвращает.

Я пытаюсь получить mutableArray, проверить, содержит ли он элемент, и, если он есть, заменить его чем-то другим. Я начал этим утром и подумал, что это будет довольно просто, но через 7 часов я все еще никуда.

Есть идеи вообще? Я был бы очень признателен за любую помощь / советы / советы в этом вопросе.

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

Код указан ниже:

NSManagedObjectContext *managedObjectContext = [[NSApp delegate] managedObjectContext];
//1. Retrieve the NSManagedObject with the price history from the MOC
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setIncludesSubentities:YES];
[request setIncludesPendingChanges:YES];
[request setIncludesPropertyValues:YES];
[request setReturnsObjectsAsFaults:NO];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"stockPriceHistory" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"stock == %@", [[self selectedObjects]objectAtIndex:0]];
[request setPredicate:predicate];
NSError *error;
NSArray *array = [ managedObjectContext executeFetchRequest:request error:&error];

NSManagedObject *test = [array objectAtIndex:0];

NSLog([test description]);
NSLog(@"%@",[[test priceData] description]);

.., который дает следующий вывод журнала (первые строки - это журналы, показывающие метки времени для объектов в массиве, которые были снова декодированы):

2010-08-29 18: 48: 54.245 Проект X [23047: a0f] 2010-08-27 13:00:00 + 0200

2010-08-29 18: 48: 54.246 Проект X [23047: a0f] 2010-08-26 13:00:00 + 0200

2010-08-29 18: 48: 54.250 Проект X [23047: a0f] 2010-08-25 13:00:00 + 0200

2010-08-29 18: 48: 54.251 Проект X [23047: a0f] 2010-08-24 13:00:00 + 0200

2010-08-29 18: 48: 54.252 Проект X [23047: a0f] 2010-08-23 13:00:00 + 0200

2010-08-29 18: 48: 54.253 Проект X [23047: a0f] 2010-08-20 13:00:00 + 0200

2010-08-29 18: 48: 54.253 Проект X [23047: a0f] 2010-08-19 13:00:00 + 0200

2010-08-29 18: 48: 54.255 Проект X [23047: a0f] 2010-08-18 13:00:00 + 0200

2010-08-29 18: 48: 54.255 Проект X [23047: a0f] 2010-08-17 13:00:00 + 0200

2010-08-29 18: 48: 54.256 Проект X [23047: a0f] 2010-08-16 13:00:00 + 0200

2010-08-29 18: 48: 54.256 Проект X [23047: a0f] 2010-08-13 13:00:00 + 0200

2010-08-29 18: 48: 54.257 Проект X [23047: a0f] 2010-08-12 13:00:00 + 0200

2010-08-29 18: 48: 54.258 Проект X [23047: a0f] (сущность: stockPriceHistory; идентификатор: 0x10043d950; данные: { dataPointCount = 0; priceData = "(... не ноль ..)"; stock = "0x100445040"; })

2010-08-29 18: 48: 54.260 Проект X [23047: a0f] ( ) (ГБД)

1 Ответ

0 голосов
/ 29 августа 2010

Вы переопределили NSManagedObject для этого класса? Если да, переопределили ли вы методы доступа к массиву? Его метод awakeFromFetch вызывается? Где выполняется вызов initWithCoder? Вероятно, должно быть в awakeFromFetch. Вы можете иметь один постоянный атрибут «codedArray» и другой непостоянный атрибут «массив». В awakeFromFetch прочитайте атрибут codedArray, расшифруйте его и установите свойство array, которое будет читать остальная часть кода.

codedArray = [self valueForKey:@"codedArray"];
// decode array...
[self setPrimitiveValue:decodedArray forKey:@"array"]; 

Почему вы помещаете в Core Data только массив? Хм, да, кажется странным. Если вы используете кодер, вы можете просто написать в плоский файл. Поскольку каждый объект выдается как отдельная строка, вы теряете преимущества базы данных SQL; Вы должны прочитать весь массив в память, прежде чем выполнять поиск по нему.

...