2013-07-09 55 views
0

我已90個CoreData實體稱爲「ItemModel」與2點的屬性爲「uid」,「描述」,其中每個項被插入作爲NSManagedObject:不止一次更新NSManagedObject的CoreData保存多個副本?

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName: @"ItemModel" inManagedObjectContext: AFYDelegate.managedObjectContext]; 

第一服務器呼叫分配爲「uid」來在上面爲關鍵「uid」提取的90個項目中的每一個。上下文不保存在這裏。

在稍後的第二服務器呼叫,我喜歡使用indexPath更新「描述」爲90項,爲的NSManagedObject的每個 - 通過獲取和每個對象傳遞到下面的方法和保存的上下文:

[self updateItemToDataModel:object withData: description]; 

.... 
.... 

- (void)updateItemToDataModel:(NSManagedObject *) object withData:(NSString *)data 
{ 
    [object setValue:data forKey:@"description"]; 

    NSError * error = nil; 
    if (![self.managedObjectContext save:&error]) { 
     //Handle any error with the saving of the context 
     NSLog(@"%@",error.localizedDescription); 
    } 
} 

上面的代碼在關閉模擬器並再次運行代碼後更新CoreData BUT時會有相同的'uid'和'description'兩個副本。這意味着我現在有180件商品。反覆關閉並運行代碼會創建越來越多的項目。

我試着刪除updateItemToDataModel方法,重置模擬器,它可以很好地處理90個項目。

我是新來的CoreData,如果有人可以幫忙。我的代碼有什麼問題,如果我只想更新現有的項目?

+0

你如何檢索你的'對象'?你有這個代碼嗎? – Jamie

+1

在UICollectionView和NSFetchedResultsController中通過indexPath檢索對象 - NSIndexPath * indexPath = [[self.collectionView indexPathsForSelectedItems] lastObject]; NSManagedObject * object = [[self fetchedResultsController] objectAtIndexPath:indexPath]; – chongsj

回答

1

您每次都將一個新對象插入到MOC(託管對象上下文)中 - 而不是執行提取並查找您希望更新的對象的現有實例。

,以獲取現有對象可能會執行像這樣爲獲取請求......

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"uid == %@", uidToMatch]; 
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setPredicate:predicate]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"ItemModel" inManagedObjectContext:managedObjectContext]]; 
NSError * error = nil; 
NSArray * results = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if ([results count]) { 
    // you may need to handle more than one match in your code... 
    // you could also set a fetch limit of 1 and guarantee you only get the first object, eg: [fetchRequest setFetchLimit:1]; 
} 
else { 
    // no results 
} 

你可能想包裝在一個輔助功能,這樣你就可以重新使用它。並閱讀NSFetchRequest,NSPredicate和編寫謂詞,以便更好地獲取請求。

+0

太棒了!謝謝尼古拉斯!只是澄清NSArray結果是返回NSManagedObject類對象,我只是做setValue?何時我應該正確保存self.managedObjectContext? - 它是在ViewDidUnload的RootViewController或AppDelegate applicationWillTerminate? – chongsj

+1

它返回與指定實體名稱和指定謂詞相匹配的所有託管對象的數組。在這種情況下,您的「ItemModel」對象。決定何時保存數據取決於您。進行保存可能很昂貴,因此您想等到用戶完成更改(例如:解散編輯界面時)。您可能不想等到您的應用程序關閉才能保存 - 因爲如果它崩潰,您將丟失所有數據。 (順便說一句,永遠不要依賴viewDidUnload或applicationWillTerminate被調用 - 不能保證它們會被調用。) –

+0

再次感謝偉大的建議。 – chongsj

相關問題