iPhone, Core Data, Предикат с собственной проблемой

Мне нужно перезагрузить Person NSManagedObject, прежде чем я передам его следующему представлению.

Это связано с тем, что используемый мной fetchedResultsController возвращает только подмножество атрибутов, и мне нужен полный набор в следующем представлении.

Пока я пытаюсь что-то вроде:

- (void)tableView:(UITableView *)tableViewPassed didSelectRowAtIndexPath:(NSIndexPath *)indexPath {        
        Person *partialPerson = (Person *)[self.fetchedResultsController objectAtIndexPath:indexPath];

   NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:[partialPerson.managedObjectContext]];

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:entity];
...

Теперь я не могу заставить предикат сделать это правильно, пока я пробовал:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", partialPerson];

а также

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", partialPerson.objectID];

Но ни один из них, похоже, не работает. Что я здесь делаю неправильно? Хороший ли это подход?

Заранее спасибо за любые предложения, Мэтт


person Sway    schedule 11.02.2010    source источник


Ответы (2)


Вам просто нужно получить доступ к атрибутам, которые не содержат ошибок, и они будут автоматически повреждены. Вам вообще не нужно обновлять объект.

Обновлять

Хранение изображений или любых двоичных данных в Core Data имеет несколько основных правил, которым необходимо следовать:

< 100kb store it in the same entity
< 1 mb store it in a separate entity on the other end of a relationship
> 1 mb store it on disk and reference it in the same entity

Похоже, вы храните слишком много двоичных данных в основной таблице. Чтобы исправить это, следуйте приведенному выше правилу, и это решит вашу проблему.

Но это не отменяет мой первоначальный ответ в том смысле, что вы можете указать своей выборке извлекать атрибут 1, атрибут 3 и атрибут 5, и когда вам нужно получить доступ к атрибуту 3, вы просто получите к нему доступ, а Core Data «выполнит правильная вещь» и загружайте его, когда пытаетесь получить к нему доступ. В этой ситуации нет причин «перезагружать» объект.

person Marcus S. Zarra    schedule 11.02.2010
comment
Привет Маркус, Спасибо за ваш ответ. Причина, по которой я пытался это сделать, заключалась в том, чтобы решить проблему с производительностью. Моя модель содержит строковые поля вместе с полем изображения, в котором хранятся фотографии, сделанные камерой пользователя. Строк может быть много, и их начальная загрузка на устройстве происходит довольно медленно. Иногда несколько секунд. Если я ограничил свой fetchRequest (через setPropertiesToFetch) и исключил поле изображения, то результирующее ускорение увеличилось более чем в 10 раз. Однако это вводит необходимость перезагрузки записи. Есть ли у вас какие-либо предложения для этого типа проблемы с производительностью? Спасибо, Мэтт - person Sway; 12.02.2010
comment
Маркус, еще раз спасибо. Я не знал об этих ограничениях Core Data. Я должен буду изменить мою модель как можно скорее. Привет, Мэтт - person Sway; 14.02.2010

Почему вам нужно обновить partialPerson?

Просто передайте его следующему представлению, и все готово!!! Вы можете делать все, что хотите, с переменной partialPerson в следующем представлении. Не вижу причин, по которым вам нужно его перепрошивать.

myViewController.myPartialPerson = partialPerson;
person Hoang Pham    schedule 12.02.2010