2014-03-28 120 views
0

我將舊的巨大sqlite數據庫轉換爲核心數據,現在我面臨內存問題。iOS,核心數據:內存問題

-(void)linkCoinsToCoinagesInPeriods 
{ 
DBAccess *acc=[[DBAccess alloc]init]; 
NSFetchRequest *coinagesFetch=[NSFetchRequest fetchRequestWithEntityName:@"Coinage"]; 
NSArray *coinages=[_context executeFetchRequest:coinagesFetch error:nil]; // 2000+ items 

for(Coinage *coinage in coinages) 
{ 
    //retrieving different quantity of int objects less then 200 from database 

    NSMutableArray *coinsArr=[acc returnKMListFromCoinageCell:1 period:coinage.uID.intValue]; 

    for(dbType *obj in coinsArr) 
    { 
     NSFetchRequest *coinsFetch=[NSFetchRequest fetchRequestWithEntityName:@"Coin"]; 
     NSPredicate *predicate=[NSPredicate predicateWithFormat:@"uID=%@",[NSNumber numberWithInt:obj.kmID]]; 
     coinsFetch.predicate=predicate; 
     NSArray *coins=[_context executeFetchRequest:coinsFetch error:nil]; 
     for(Coin *coin in coins) 
     { 
      coin.coinage=coinage; 
      NSLog(@"Linked coin to coinage: %@ -> %@",coin.uID, coinage.name); 
     } 
     coinsFetch=nil; 
    } 
    coinsArr=nil; 
    [self saveContext]; 

} 
} 

同時我開始運行此方法我的處理器顯示97%,內存消耗在第一分鐘後運行約108.1 MB。

最後,Xcode中拋出我:

CoreData:錯誤:(21)在數據庫/用戶/ IA /庫/應用程序支持/ iPhone模擬器/ 7.0.3 /應用/ C5CCADE1-9FDD I/O錯誤-4A03-BC44-FAD1C16DB0EF /文件/目錄/ wci.sqlite。 SQLite錯誤代碼:21,'無法打開數據庫文件'

坦率地說,我在我的代碼中找不到缺陷。最近,我寫了類似的方法,插入20000個對象後內存大約爲50MB。任何幫助?謝謝你在前進

+0

http://stackoverflow.com/questions/18550873/ios-coredata-large-set-insert。參考我的答案,接受它是否對你有幫助。 –

+0

沒有太大的幫助,但地獄好主意是插入N後重置上下文。我會接受你的回答,但首先你應該在這裏提交一個。 – NCFUSN

回答

0

ios Coredata large set insert

[thisContext setUndoManager:無]。 這是追趕線。 UndoManager需要大量內存。插入時不需要撤消管理器,將其設置爲空會減少內存+在很大程度上增加插入。

+0

謝謝。在這種情況下,UndoManager是無用的。 – NCFUSN