2

既存のプロジェクトでは、プロジェクトが作成されてからずっと後に Core Data を導入しようとしたため、そのモデルは既に整っています。xcdatamodel を作成し、唯一のクラスを追加しました。そのクラスは、アプリケーション内のオブジェクトのグローバル ストレージとして機能する必要があります。クラスは NSManagedObject を適切に実装しており、コンテキストで作成および保存され、フェッチ結果とともに取得されることを確認しました。

このクラスにデータを保存するには、NSMutableArray を使用します。しかし、これはうまくいきません。このクラスのフラグメントを次に示します。

@interface WZMPersistentStore : NSManagedObject<NSCoding> {
 NSMutableArray *persistentStorage;
}

@property(nonatomic,retain) NSMutableArray *persistentStorage;

-(void)add:(id)element;
-(void)remove:(id)element;
-(id)objectAtIndex:(NSUInteger)index;
-(NSUInteger)num;

@end

実装では、次のように initWithEntity もオーバーライドします。

- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context {
 NSLog(@"init with entity");
 [super initWithEntity:entity insertIntoManagedObjectContext:context];

 return [self init];
}

init メソッドは変更可能な配列のみを初期化します。ログから、エンティティの作成時にアプリ デリゲートによって適切に呼び出されることがわかります。add メソッドはメッセージ insertObject をpersistentStorageに送信するだけです。これから来る質問:

  1. 私は「概念的に」正しくやっていますか?つまり、管理対象オブジェクトにインスタンス変数を持ち、私のように初期化するのは正しいですか?
  2. nsがpersistentStorageのサイズをログに記録すると、addObjectメッセージの直後にログを記録しても常に0になります(編集:それは真実ではありません。もう一度確認したところ、正しく1が追加されました)
  3. 管理対象オブジェクトクラスからpersistentStorageに格納されるオブジェクトは、属性を持つ通常のクラスです。私は彼らと何かする必要がありますか?実行時にエラーが発生していないため、そうではないと思います。
4

2 に答える 2

2

いいえ、それは「正しい」アプローチではありません。でインスタンス変数の初期化を実行できますawakeFromFetch。NSManagedObject サブクラスに関する Apple のガイドラインには、次のようなものがあります。

initWithEntity:insertIntoManagedObjectContext:また、 、 dealloc、またはをオーバーライドすることもお勧めしません finalize。メソッド内の値の変更 initWithEntity:insertIntoManagedObjectContext: はコンテキストによって認識されず、注意しないとそれらの変更が保存されない場合があります。ほとんどの初期化のカスタマイズは、いずれかの awake… メソッドで実行する必要があります。override を行う場合 initWithEntity:insertIntoManagedObjectContext:は、メソッドの説明に記載されている要件に準拠していることを確認する必要があります [...] ( NSManagedObject Class Reference )

本当に役立つには、あなたが達成しようとしていることをより深く理解する必要があります. とにかく、先に進む前に、Apple のCore Data Programming Guideとサンプル コードを徹底的に調べることを強くお勧めします。

于 2010-08-06T03:20:55.617 に答える
0

私はついにこの問題を解決することができました。私が Objective-C の初心者であっても、プロジェクトが完了した後にコア データを導入するのは得策ではないと思います。多くの人がそれは簡単だと主張しているとしても. 残念なことに、そう言っているすべての人が、1 つのエンティティーと 1 つの文字列属性を変更するという非常に単純なチュートリアルを証拠として示しています。私のプロジェクトの代わりに、既存のコードに加えて、元のモデルを壊すいくつかのサブクラス化 (NSManagedObject など) に加えて、多くのコードを書くことになりました。この追加コードも慎重に作成する必要があります。派生する問題は、属性が保存されていないという単純なものから、間違ったエンティティを削除するという危険なものまであります。

実際、私の問題は、シリアル化のプロセスに関与するクラスのデコードおよびエンコード メソッドの構成が間違っていたことが原因でした。

私の質問について:

-私はまだ目標に自信がないので、ポイント1はまだ答えられていません-c

- ポイント 2、関連オブジェクトのエンコード/コードに問題があると述べました。

-ポイント3、私は間違っていました。関連するクラスがどれほど複雑であるかに応じて、記述するコードがたくさんあります。

于 2010-08-01T19:07:51.833 に答える