Я начинаю чувствовать себя довольно глупо - я просмотрел сайт и обнаружил несколько вещей, которые приближаются к моей проблеме, но просто не могу понять это (помогите М. Зарре, после прочтения вашей книги я чувствовал себя довольно хорошо о 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] (
)
(ГБД)