Я начинаю чувствовать себя довольно глупо - я просмотрел сайт и нашел несколько вещей, которые приближаются к моей проблеме, но просто не могу понять это (помогите М. Зарре, после прочитав вашу книгу, я чувствовал себя неплохо в отношении Core Data, но теперь я нахожусь на своем пути!). Несмотря на рекомендации эксперта, я решил сохранить NSMutableArray как трансформируемый атрибут в моем основном объекте данных. Сам массив заполняется пользовательскими объектами и имеет необходимые методы encodeWithCoder: и initWithCoder:. Я добавил NSLogs, чтобы увидеть, когда они стреляют.Основные данные, не возвращающие свойство NSMutableArray
Теперь, запустив первый раз, заселять все, и т.д., это нормально, и я сохранить все на выходе (я могу увидеть в файле 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] (объект: stockЦенИстория; id: 0x10043d950; данные : { dataPointCount = 0; ценаData = "(... не ноль ..)"; stock = "0x100445040"; })
2010-08-29 18: 48: 54,260 Проект X [23047: a0f] ( ) (GDB)
Спасибо за ваш ответ. Кажется, я вроде как следую. Объекты: priceHistory: NSManagedObject, который содержит преобразованный атрибут (который сам состоит из других объектов, которые кодируются, как описано выше). Я не делаю en/decoding в самом NSMutableArray, поскольку я позволяю Core Data делать это. Поэтому я не уверен, какую выгоду у вас будет иметь ваш метод? Фактически у одного было бы два свойства, но я думаю, что один будет делать - как в моем коде, который работает и сохраняет вещи правильно, но по какой-то причине не возвращает их из Core Data. – NSSunrider
Ах, извините, мой код Core Data совместим с 10.4, который не сделал для вас всю кодировку. Надеюсь, в наши дни вам не нужно сочетать атрибуты. Вы переопределяете атрибуты атрибутов KVC для priceHistory? –
Я попытался переопределить (изменить стандартный код кода xcode 4 с id на NSMutableArray), и я попытался без переопределения чего-либо - того же результата. – NSSunrider