亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理臨時NSManagedObject實例?

如何處理臨時NSManagedObject實例?

iOS
守著一只汪 2019-10-05 13:20:06
我需要創建NSManagedObject實例,對它們進行一些處理,然后將其丟棄或存儲到sqlite db。問題是,我無法創建NSManagedObject未連接到的實例,NSManagedObjectContext這意味著在我決定不需要數據庫中的某些對象之后,必須以某種方式進行清理。為了解決這個問題,我使用相同的協調器創建了一個內存中的存儲,并使用assignObject:toPersistentStore.Now來放置臨時對象,如何確保這些臨時對象不會到達數據,而這些數據是我從兩家商店的共同點?還是我必須為此任務創建單獨的上下文?UPD:現在,我正在考慮為內存存儲創建單獨的上下文。如何將對象從一個上下文移動到另一個上下文?僅使用[context insertObject:]?在這種設置下可以正常工作嗎?如果我從對象圖中插入一個對象,那么整個圖是否也會插入上下文中?
查看完整描述

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

}


查看完整回答
反對 回復 2019-10-05
?
MM們

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;

注意,保存子上下文將更改應用于父上下文。保存父上下文將保留更改。



查看完整回答
反對 回復 2019-10-05
?
蝴蝶刀刀

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在錯誤的上下文中使用,則保存時會出現異常。


查看完整回答
反對 回復 2019-10-05
  • 3 回答
  • 0 關注
  • 556 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號