2010-08-29 2 views
0

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

ответ

0

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

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

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

+0

Спасибо за ваш ответ. Кажется, я вроде как следую. Объекты: priceHistory: NSManagedObject, который содержит преобразованный атрибут (который сам состоит из других объектов, которые кодируются, как описано выше). Я не делаю en/decoding в самом NSMutableArray, поскольку я позволяю Core Data делать это. Поэтому я не уверен, какую выгоду у вас будет иметь ваш метод? Фактически у одного было бы два свойства, но я думаю, что один будет делать - как в моем коде, который работает и сохраняет вещи правильно, но по какой-то причине не возвращает их из Core Data. – NSSunrider

+0

Ах, извините, мой код Core Data совместим с 10.4, который не сделал для вас всю кодировку. Надеюсь, в наши дни вам не нужно сочетать атрибуты. Вы переопределяете атрибуты атрибутов KVC для priceHistory? –

+0

Я попытался переопределить (изменить стандартный код кода xcode 4 с id на NSMutableArray), и я попытался без переопределения чего-либо - того же результата. – NSSunrider

Смежные вопросы