2012-06-06 24 views
2

我需要執行提取請求。但是當我這樣做的時候,我沒有錯NSManagedObject s(每個對象大約5 Mb,這就是爲什麼我得到內存警告)。 Apple提供錯誤核心數據的可能性(當對象沒有加載到RAM中時)。我想我的對象使用這種可能性。核心數據。 ExecuteFetchRequest與錯誤NSManagedObjects(不在RAM中)

這裏是我的代碼

+ (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)

應用程序崩潰後

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

,因爲對象的所有數據將顯示在iPhone的RAM。

看來默認選項returnsObjectsAsFaults = YES不起作用。

+0

你能發佈崩潰日誌嗎?另外說一說你的模型和圖像(大小)。 –

+0

沒有崩潰日誌。只是記憶警告,然後墜毀。當我試圖只抓取5個對象 - 一切正常(設置fetchLimit) –

回答

3

這些對象可能被作爲錯誤返回;您可以使用isFault進行驗證。問題是Core Data會自動預取這些對象的屬性值,並將它們放入行緩存(在內存中)。您可以通過在NSFetchRequest對象上將includesPropertyValues設置爲NO來禁用此行爲。

查看includesPropertyValues documentation瞭解所有這些和性能影響的詳細信息。

另外,您可能不想直接在數據庫中存儲大量大對象。如果您的目標是iOS 5,那麼您可能應該考慮使用external storage,否則您可以使用核心數據中的名稱/路徑/ ID分別使用單獨的文件。

+0

非常感謝。設置includesPropertyValues無幫助。 –

+0

但現在我有另一個問題。當我加載數據時,我想從每個對象中提取id,但是當我想要獲取id時,似乎所有對象都出現在RAM中,最後是應用程序崩潰(當所有對象出現在RAM中時)。我可以隱藏NSMAnagedObjects的某些字段,當它們出現在我想要獲取另一個字段後? (除了[上下文重置],因爲我需要其他對象) –

+0

如果您要訪問所有對象的屬性的子集,您應該使用@ meccan的建議,並使用帶有setPropertiesToFetch的NSDictionaryResultType:使用您的id屬性。 –

2

您可以爲NSFetchRequest設置- (void)setResultType:(NSFetchRequestResultType)type,並且只使用-(void)setPropertiesToFetch:(NSArray *)values方法獲取對象的相關屬性。

只有懶加載所需的屬性。

+0

1)我應該設置什麼結果類型? (我找不到)2)關於setPropertiesToFetch:我需要稍後使用所有的屬性 –

+0

我試過[request setResultType:NSDictionaryResultType];但這並沒有幫助 –

+0

,你應該設置setPropertiesToFetch和結果類型爲:NSDictionaryResultType – CarlJ