3 回答

TA貢獻1806條經驗 獲得超8個贊
注意:此答案很舊。查看評論以獲取完整歷史記錄。此后,我的建議已更改,我不再建議使用未關聯的NSManagedObject實例。我當前的建議是使用臨時子NSManagedObjectContext實例。
原始答案
最簡單的方法是創建NSManagedObject沒有關聯的實例NSManagedObjectContext。
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myMOC];
NSManagedObject *unassociatedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
然后,當您要保存它時:
[myMOC insertObject:unassociatedObject];
NSError *error = nil;
if (![myMoc save:&error]) {
//Respond to the error
}

TA貢獻1886條經驗 獲得超2個贊
iOS5為Mike Weller的答案提供了更簡單的選擇。而是使用子 NSManagedObjectContext。它消除了通過NSNotificationCenter蹦床的需要
創建子上下文:
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
childContext.parentContext = myMangedObjectContext;
然后使用子上下文創建對象:
NSManagedObject *o = [NSEntityDescription insertNewObjectForEntityForName:@"MyObject" inManagedObjectContext:childContext];
僅在保存子上下文時應用更改。因此,放棄更改只是不保存。
關系仍然存在限制。即您不能在其他上下文中創建與對象的關系。為了解決這個問題,可以使用objectID來從子上下文中獲取對象。例如。
NSManagedObjectID *mid = [myManagedObject objectID];
MyManagedObject *mySafeManagedObject = [childContext objectWithID:mid];
object.relationship=mySafeManagedObject;
注意,保存子上下文將更改應用于父上下文。保存父上下文將保留更改。

TA貢獻1801條經驗 獲得超8個贊
實現此類目標的正確方法是使用新的托管對象上下文。使用相同的持久性存儲創建托管對象上下文:
NSManagedObjectContext *tempContext = [[[NSManagedObjectContext alloc] init] autorelease];
[tempContext setPersistentStore:[originalContext persistentStore]];
然后添加新對象,對其進行突變等。
當需要保存時,您需要在tempContext上調用[tempContext save:...],并處理save通知以將其合并到原始上下文中。要丟棄這些對象,只需釋放此臨時上下文并忽略它即可。
因此,當您保存臨時上下文時,更改將保存到存儲中,而您只需要將這些更改恢復到您的主上下文中即可:
/* Called when the temp context is saved */
- (void)tempContextSaved:(NSNotification *)notification {
/* Merge the changes into the original managed object context */
[originalContext mergeChangesFromContextDidSaveNotification:notification];
}
// Here's where we do the save itself
// Add the notification handler
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(tempContextSaved:)
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
// Save
[tempContext save:NULL];
// Remove the handler again
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
這也是您應該處理多線程核心數據操作的方式。每個線程一個上下文。
如果您需要從此臨時上下文訪問現有對象(以添加關系等),則需要使用對象的ID來獲取新的實例,如下所示:
NSManagedObject *objectInOriginalContext = ...;
NSManagedObject *objectInTemporaryContext = [tempContext objectWithID:[objectInOriginalContext objectID]];
如果您嘗試NSManagedObject在錯誤的上下文中使用,則保存時會出現異常。
- 3 回答
- 0 關注
- 556 瀏覽
添加回答
舉報