23

この質問はおそらくロングショットです。エンティティを削除した後に保存すると、コア データ プロジェクトで発生するエラーがわかりません。

私が扱っている主なエンティティは 2 つあります。衣装と記事です。問題なく作成できますが、削除すると次のエラー ログが表示されます。

衣装の場合:

2009-09-22 20:17:37.771 itryiton[29027:20b] Operation could not be completed. (Cocoa error 1600.)
2009-09-22 20:17:37.773 itryiton[29027:20b]   {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = outfitArticleViewProperties;
    NSValidationErrorObject = <Article: 0x12aa3c0> (entity: Article; id: 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1> ; data: {
    articleID = 2009-09-22 19:05:19 -0400;
    articleImage = 0x12b4de0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 19:05:19 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue =     {(
        <OutfitArticleViewProperties: 0x1215340> (entity: OutfitArticleViewProperties; id: 0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1> ; data: {
    article = 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1>;
    articleViewPropertiesID = nil;
    outfit = nil;
    touch = nil;
    view = "(...not nil..)";
})
    )};
}

記事を削除すると、次のようになります。

2009-09-22 18:58:38.591 itryiton[28655:20b] Operation could not be completed. (Cocoa error 1560.)
2009-09-22 18:58:38.593 itryiton[28655:20b]   DetailedError: {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = articleImage;
    NSValidationErrorObject = <Article: 0x12aa340> (entity: Article; id: 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1> ; data: {
    articleID = 2009-09-22 18:58:26 -0400;
    articleImage = 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 18:58:26 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b5010 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue = <ArticleImage: 0x12ad600> (entity: ArticleImage; id: 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1> ; data: {
    article = 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1>;
    image = "(...not nil..)";
});
}

1600 エラーは次のとおりです。

NSValidationRelationshipDeniedDeleteError 削除ルール NSDeleteRuleDeny と
の関係を示すエラー コードが 空ではありません。

Mac OS X v10.4 以降で利用できます。

CoreDataErrors.h で宣言されています。

しかし、どの関係が削除を妨げているのか、一生わかりません。Core Data ウィザードが私の方法のエラーを確認できる場合、私は謙虚になります.

実際には解決していないため、これを解決済みとしてマークすることはできませんが、回避策があります。.mfor each に、次managedObjectsのようなメソッドを追加しました。

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

ご覧のとおり、最初に手動でリレーションシップを削除し、次にオブジェクト自体を削除します。他のオブジェクトではnil-ing、カスケードを取得するために、オブジェクトのリレーションシップの一部で私の delete メソッドが呼び出されます。

4

8 に答える 8

9

削除に失敗するという問題があり、この質問にたどり着きました。そして、私は自分の問題を理解し、それも共有したいと考えました。おそらく誰かも同じ問題を抱えているでしょう.

私が犯した間違いは、削除しようとしているオブジェクト (A) が、削除ルールとして NULL を持つ別のオブジェクト (B) との関係を持っていることです。ただし、オブジェクト B にも A との関係があり、オプションではありません。したがって、A を削除すると、B の A の関係は null になり、許可されません。削除ルールをカスケードに変更すると、機能しました。

于 2011-12-10T06:58:55.030 に答える
3

私は実際には解決しなかったため、これを解決済みとマークすることはできませんが、回避策はあります。各managedObjectsの.mに、次のようなメソッドを追加しました。

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

ご覧のとおり、最初に手動でリレーションシップを削除してから、オブジェクト自体を削除します。他のオブジェクトでは、nil-ingの代わりに、カスケードを取得するために、いくつかのオブジェクト関係でdeleteメソッドが呼び出されます。

私はまだ「正しい」答えに興味があります。しかし、これは私が持っている最善の解決策であり、関係を削除する方法をきめ細かく制御することができます。

于 2009-10-17T05:01:18.490 に答える
3

リレーションシップへのアクセサを自分で実装することはありますか? 私はかつて次のようなコードを持っていました

-(NSSet*)articles
{
       re-calculates properties....
       return [self primitiveValueForKey:@"articles"];
}

NSManagedObject のサブクラスで保存エラーが発生しました。このオブジェクトが ManagedObjectContext から削除されると、CoreData はアクセサー「アーティクル」を呼び出して、削除の伝達を処理します。この記事の再計算は削除の伝播中に発生し、私の場合は無効化された「記事」が復活しました。

于 2010-01-03T01:25:47.720 に答える
2

xcdatamodelファイルのDeny削除規則を確認してください。それぞれの関係が見つかるまでクリックします。このルールを変更するか、管理対象オブジェクトの削除方法を調整して、関係へのルールの適用を予測する必要があります。

于 2009-09-23T00:46:33.743 に答える
1

- (void)willSave メソッドにコードがあり、 - (BOOL)isDeleted が既に true を返した後に削除管理オブジェクトのプロパティの一部を更新したため、最近このエラーが発生しました。

私はそれを修正しました:

- (void)willSave {
    if (![self isDeleted]) {
    //Do stuff...
    }
}
于 2013-05-21T14:19:21.283 に答える
0

私は同様の問題を抱えていましたが、問題は.xibファイルにありました。関連するアレイコントローラの[削除時にオブジェクトを削除する]チェックボックスをオンにすると([バインド]-> [コンテンツセット]の下)、問題は解決しました。

これがあなたのケースに役立つかどうかはわかりませんが、InterfaceBuilder内のどこかに隠されていることが判明した問題について多くの髪の毛が灰色になっています。

于 2009-12-03T18:27:51.923 に答える
0

私の場合、NSManagedObject: isDeleted のサブクラスで無邪気にカスタム メソッドを作成しました。削除/名前変更するまで、奇妙な保存例外が発生していました。正気を失った後、今度はもっと徹底的にドキュメントを読み直しました。オーバーライドしてはならない NSManagedObject メソッドの 1 つをオーバーライドしたことが判明しました。

このドキュメントからの抜粋が役立つかどうかを確認してください。

オーバーライドしてはならないメソッド

NSManagedObject 自体は、NSObject の多くの機能をカスタマイズして、マネージド オブジェクトを Core Data インフラストラクチャに適切に統合できるようにします。コア データは、次のメソッドの NSManagedObject の実装に依存しているため、これらのメソッドを絶対にオーバーライドしてはなりません。 :、managedObjectContext、エンティティ、objectID、isInserted、isUpdated、 isDeleted、および isFault、alloc、allocWithZone:、new、instancesRespondToSelector:、instanceMethodForSelector:、methodForSelector:、methodSignatureForSelector:、instanceMethodSignatureForSelector:、または isSubclassOfClass:

それに加えて、オーバーライドできる他のメソッドがありますがwillAccessPrimitiveForKey, didAccessPrimitiveForKey、アクセサーとwillChangevalueForKey, didChangeValueForKeyセッターで、次のようなスーパー実装を呼び出すか呼び出す必要があります....

于 2013-02-12T14:28:33.253 に答える
0

オプションではない親子関係で、カスケード削除で非常によく似た問題が発生していました。親関係の削除ルールがカスケードに設定されていると思っていたので、非常に混乱しました。Xcode のデータ モデル エディタが削除ルールを保存していなかったことが判明しました。Cascade に設定し、別のビューに移動して戻ってくると、再び無効化するように設定されます。Xcode を再起動し、削除ルールをカスケードに設定する必要がありました。これを行った後、すべてが機能しました。

したがって、他の誰かがこの問題に遭遇した場合は、より複雑な解決策を検討する前に、Xcode が削除ルールを保存していることを再確認してください。

ちなみに、Xcode 5 のデータ モデル エディターで iOS のコア データを使用しています。

于 2014-01-01T19:11:29.593 に答える