2013-10-04 40 views
8

我已經更新我的應用程序支持的iOS 7,並已面臨的問題是在屏幕上的一個我[context save];我得到以下錯誤:NSMergeConflict上iOS7

NSCocoaErrorDomain Code=133020 "The operation couldn’t be completed. (Cocoa error 133020.)" UserInfo=0x1115a6d0 {conflictList=(
"NSMergeConflict (0x1115a670) for NSManagedObject (0xf25c850) with objectID '0xf25c070 <x-coredata://76AF57C8-F7FF-4880-B06B-63F8B780C96D/Screen/p7>' with oldVersion = 5 and newVersion = 6 
and old object snapshot = {\n index = 3;\n message = \"<null>\";\n status = 0;\n} and new cached row = {\n index = 3;\n message = \"<null>\";\n status = 0;\n}" 

在iOS6的不會發生此問題。

更新: 代碼managedObjectContext

-(NSManagedObjectContext *)managedObjectContextForCurrentThread{ 
if ([NSThread isMainThread]) 
{ 
    NSManagedObjectContext *parentContext = self.mainManagedObjectContext.parentContext; 
    [parentContext performBlockAndWait:^{ 
     NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]; 
     [[self mainManagedObjectContext] setMergePolicy:mergePolicy]; 
    }]; 
    return self.mainManagedObjectContext; 
} 
else 
{ 
    NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext *threadContext = [threadDict objectForKey:kCGMManagedObjectContextKey]; 
    if (threadContext == nil) 
    { 
     threadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     NSManagedObjectContext *parentContext = self.mainManagedObjectContext.parentContext; 
     [parentContext performBlockAndWait:^{ 
      NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]; 
      [parentContext setMergePolicy:mergePolicy]; 
     }]; 
     [threadContext setParentContext:self.mainManagedObjectContext]; 
     [threadDict setObject:threadContext forKey:kCGMManagedObjectContextKey]; 
    } 
    return threadContext; 
} 

}

+0

與我面對的問題完全相同,您遇到的任何解決方案?我不明白爲什麼有這個問題,iOS 6沒有抱怨。在我的情況下,我沒有看到任何理由爲什麼這會發生,因爲我正在編輯的ManagedObject來自我正在保存的同一個ManagedObjectContext,爲什麼它應該抱怨合併錯誤? –

回答

15

根據蘋果的文檔

NSManagedObjectMergeError = 133020

此錯誤代碼來表示合併政策失敗的核心數據無法完成合並。

你的代碼中是否有任何合併策略?請嘗試NSMergeByPropertyObjectTrumpMergePolicy。

[self.context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 
16

我剛剛花了兩天時間調試完全相同的錯誤。你的應用程序和我的應用程序的區別在於,我的程序只能訪問主線程的核心數據,所以合併錯誤更令人費解。

在我們的例子中,我將其縮小到事實,我們有一個單向關係 - A有很多Bs(模擬爲NSSet),但是B不知道它的A.我們有一個方法修改了A和一個B,當我們去保存這些更改時會導致合併錯誤。此代碼長時間在iOS 5 & 6上運行良好,並且僅在iOS 7上開始失敗。

確實,添加合併策略會使錯誤消失,但它也可能會掩蓋其他錯誤。在我們的案例中,我們寧願看到那些錯誤,而不是具有不一致DB的風險。

將關係更改爲雙向使錯誤消失。我們的應用不需要反向鏈接,但它們也沒有受到傷害。 (並且幸運的是,改變這種關係被正確處理爲輕量級遷移 - 核心數據自動填充在我們的這些反向鏈接中。)

+0

我有完全相同的問題,這幫助我解決它! NSMergeConflict不是很清楚:/ – davbryn

+0

還記得在Core Data編輯器中設置'Inverse'字段。我們在應用程序中存在雙向關係,但開發者忘記正確設置了反向關係,導致了這種僞衝突。 –

0

我得到了類似的錯誤,在我的情況下,鎖定NSPersistentStoreCoordinator工作。

[context.persistentStoreCoordinator lock]; 
[context performBlockAndWait:^{ 
    // do something 
}]; 
[context.persistentStoreCoordinator unlock] 

我不知道它爲什麼起作用,但我懷疑NSManagedObjectContext的錯誤。 我希望這會有所幫助。

0

我在完整存儲測試時得到了這個。所以看起來,任何類型的合併失敗(在我的情況下,存儲是完整的,持久存儲不能更新)會產生這種情況。

5

在Apple Watchkit擴展中使用Xcode 6.3.2,並且在嘗試進行多個更新和保存時遇到了同樣的錯誤。 setMergePolicy解決了這個問題,下面是swift代碼:

context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

確保將上面的行放在context.save命令之前。

+0

使用Swift,這在解決本質上相同的問題上非常完美。謝謝! – Pierce

+0

我會**從來沒有**遇到過這個!甚至不想知道多少小時的閱讀和故障排除這一行只是救了我。 –

1

我不想通過設置合併策略來掩蓋潛在問題,而不理解首先導致NSMergeConflict的原因。

在我的情況中,我之前在我的代碼中執行過NSBatchDeleteRequestNSBatchDeleteRequest直接在持久性存儲協調器上執行,因此ManagedObjectContext不知道刪除並仍保留對已刪除對象的引用。當我稍後引用其中一個對象並嘗試保存上下文時,引發NSMergeConflict

在我的moc上調用reset()執行刪除後解決了問題。

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Tasks") 
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) 
try managedContext.execute(batchDeleteRequest) 
managedContext.reset()