10

iOS 7 をサポートするようにアプリを更新しましたが、画面の 1 つで[context save];次のエラーが表示されるという問題に直面しています。

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;
}

}

4

6 に答える 6

15

アップルのドキュメントによると

NSManagedObjectMergeError = 133020

このエラー コードは、マージ ポリシーが失敗したことを示します。コア データはマージを完了できません。

コードにマージ ポリシーはありますか? NSMergeByPropertyObjectTrumpMergePolicy を試してください。

[self.context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
于 2013-10-04T10:50:57.493 に答える
4

最初の原因を理解せずにマージ ポリシーを設定して、潜在的な問題を隠したくありませんでしたNSMergeConflict

私の状況NSBatchDeleteRequestでは、コードで以前に実行していました。これNSBatchDeleteRequestは、永続ストア コーディネーターで直接実行されるため、ManagedObjectContextは削除を認識せず、削除されたオブジェクトへの参照を引き続き保持していました。後でこれらのオブジェクトの 1 つを参照してコンテキストを保存しようとすると、NSMergeConflictがスローされました。

reset()削除を実行した後に私に電話するとmoc、問題が修正されました。

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Tasks")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
try managedContext.execute(batchDeleteRequest)
managedContext.reset() 
于 2017-09-21T09:25:38.270 に答える
1

同様のエラーが発生しました。私の場合、NSPersistentStoreCoordinator のロックが機能しました。

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

なぜ機能するのかはわかりませんが、NSManagedObjectContext のバグが疑われます。これが役立つことを願っています。

于 2014-07-26T07:00:09.270 に答える