0

私がこれを正しく述べているかどうかさえわかりませんが、ユーザーが作成したコアデータ オブジェクト インスタンスをコピーしようとしていて、それを理解するのにかなり苦労しています。

から引き込まれるオブジェクト (質問) がありmanagedObjectContextます。

これは、多くの質問があるデータベース内のクイズからのものです。

メモリ内に question1 という名前の Question インスタンスがあります。question1 を question2 というインスタンスにコピーしたいと考えています。

Question *question2 = question1;

動作することもありますが、クラッシュすることもあります (正しい方法ではないことはわかっています)。

私は NSCopying と-(id)copyWithZone:(NSZone *)ゾーンをいじっていますが、空のインスタンスを取り戻しています。

誰かがそれを助けることができれば、それは素晴らしいことです!

もう少し詳しく説明します。

question1 があります。これは Question のインスタンスです。たとえば、question1.answer はその質問の回答を返します。

質問1を質問2に単純にコピーしたい。question2 をデータモデルに保存する必要はありません。ループで使用してからリリースする必要があるだけです。

基本的に私はこれをしたい:

Question *question2 = question1;
NSLog(@"%@", question2.answer)

上記は時々機能しますが、nslog 行でランダムなクラッシュが発生することがあります。

4

2 に答える 2

6

管理オブジェクト コンテキストで新しいオブジェクトを作成し、すべての属性と関係をコピーする必要があります。

Question *question2 = [NSEntityDescription
                           insertNewObjectForEntityForName:@"Question"
                           inManagedObjectContext:context];
// Copy attributes:
question2.attr1 = question1.attr1;
question2.attr2 = question1.attr2;
// ...
// Copy relationships:
question2.rel1 = question1.rel1;
// ...

NSEntityDescriptionこれは、エンティティ記述からのすべての属性と関係を使用して処理することで自動化できますquestion1。この質問に対する (すばらしい) 回答を参照してください: How can I duplicate or copy a Core Data Managed Object? . ただし、そのコードは関連するすべてのオブジェクトも複製することに注意してください。これは、必要なものではない可能性があります。

属性/関係が多すぎない場合は、「手動」コピーの方が簡単で、関連するオブジェクトごとにコピーする必要があるかどうかを判断できると思います。

于 2012-12-01T08:50:34.020 に答える
1

マーティンの答えは正しいものです。マネージド オブジェクト コンテキスト内でのみ NSManagedObject サブクラスをインスタンス化できます。

あなたの場合、コピーされたオブジェクトを永続化したくないと言います。それを使用したいだけです。その場合、オプションがあります:

  1. 現在の管理対象オブジェクト コンテキスト内に新しいオブジェクトを作成しますが、オブジェクトは保存しません。
  2. 新しいマネージド オブジェクト コンテキストを作成し、このマネージド オブジェクト コンテキスト内にコピーを作成し、削除するときにこの 2 番目のモックの内容を保存しないでください。
  3. NSManagedObject のサブクラスではないカスタム クラスを作成します。Questionこのクラスには、使用したいクラスのフィールドのコピーが含まれているだけです。オブジェクトを取るこの新しいクラスの初期化子を作成しQuestionます。その後、ループ内でこの新しいオブジェクトを使用でき、永続化について心配する必要はありません。
于 2012-12-01T09:46:11.107 に答える