2012-06-06 2 views
2

Мне нужно выполнить запрос выборки. Но когда я это делаю, я получаю не ошибку NSManagedObject s (каждый из объектов составляет около 5 Мб, вот почему я получаю предупреждение о памяти). Apple предоставляет ошибка возможность для основных данных (когда объекты не загружаются в ОЗУ). И я хочу, чтобы мои объекты использовали эту возможность.Основные данные. ExecuteFetchRequest с ошибкой NSManagedObjects (не в ОЗУ)

Вот мой код

+ (NSMutableSet *)GetImagesWithPredicate:(NSPredicate *)predicate 
{ 
    NSString *entityName = kEntityName; 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];; 
    NSManagedObjectContext *context = appDelegate.managedObjectContext; 
    NSEntityDescription *entityDesctiption = [NSEntityDescription 
               entityForName: entityName 
               inManagedObjectContext:context]; 

    // find object 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDesctiption]; 
    [request setPredicate:predicate]; 
    NSArray *objects = [context executeFetchRequest:request error:nil]; 
    [request release]; 
    if (objects == nil) 
    { 
     NSLog(@"there was an error"); 
     return nil; 
    } 
    NSMutableSet *set = [NSMutableSet setWithArray:objects]; 
    return set; 
} 

где предикат (id < 500).

App падает после

NSArray *objects = [context executeFetchRequest:request error:nil]; 

, потому что все данные объектов появляется в оперативной памяти iPhone.

Похоже, что опция по умолчанию returnsObjectsAsFaults = YES не работает.

+0

Не могли бы вы разместить журнал аварий? Кроме того, скажите что-нибудь о вашей модели и изображениях (размер). –

+0

Не было аварийного лога. Просто предупреждение о памяти, а затем он разбился. Когда я попытался извлечь только 5 объектов - все в порядке (настроено fetchLimit) –

ответ

3

Объекты, вероятно, возвращаются как неисправности; вы можете проверить это с помощью isFault. Проблема в том, что Core Data автоматически предварительно задает значения свойств для этих объектов и помещает их в кеш строк (в памяти). Вы можете отключить это поведение, установив includesPropertyValues на номер NO на объект NSFetchRequest.

Для получения более подробной информации об этом и технических последствиях см. includesPropertyValues documentation.

Как в стороне, вы можете не захотеть хранить большое количество больших объектов в базе данных напрямую. Вероятно, вам стоит изучить external storage, если вы ориентируетесь на iOS 5, либо сами используете отдельные файлы с именами/путями/идентификаторами в Core Data.

+0

Большое спасибо. Включение настроекPropertyValues ​​в NO. –

+0

Но теперь у меня есть еще одна проблема. Когда я загружаю данные, я хочу извлечь идентификатор из каждого объекта, но когда я хочу получить идентификатор, кажется, что весь объект появляется в ОЗУ и, наконец, сбой приложения (когда все объекты появляются в ОЗУ). Могу ли я скрыть некоторые поля NSMAnagedObjects после того, как они появятся после того, как я хочу получить другое поле? (кроме [контекстного сброса], потому что мне нужны другие объекты) –

+0

Если вы хотите получить доступ к подмножеству свойств всех объектов, вы должны использовать предложение @ meccan и использовать NSDictionaryResultType с setPropertiesToFetch: с вашим свойством id. –

2

вы можете установить - (void)setResultType:(NSFetchRequestResultType)type для NSFetchRequest и получить только соответствующие атрибуты для вашего объекта с помощью метода -(void)setPropertiesToFetch:(NSArray *)values.

И только ленивая загрузка необходимых атрибутов.

+0

1) какой тип результата я должен установить? (Я не могу найти) 2) о setPropertiesToFetch: мне нужно использовать все свойства позже –

+0

Я попробовал [request setResultType: NSDictionaryResultType]; но это не помогло –

+0

, и вы должны установить setPropertiesToFetch и тип результата: NSDictionaryResultType – CarlJ

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