0

サンプルの在庫アプリで CoreData を学習しています。私のデータモデルには、「Possession」と「Asset Type」という 2 つのエンティティがあります。所有物は「assetType」と呼ばれる資産タイプと対一の関係を持ち、資産タイプは「所有物」という名前の所有物と対多の関係を持ちます。各所有物には 1 つのアセット タイプしかありませんが、アセット タイプには多くの所有物があります。

アセットの種類に基づいてテーブルビューをセクションに分類したいと思います。ただし、このためにデータ構造を設定するのに助けが必要です。

テーブルビューコントローラーをモデル化する方法は次のとおりです

テーブル セクションの NSArray 配列内の各セクション オブジェクトは、アセット タイプとなる @"Header" と、そのアセット タイプの所有物の配列である @"Possessions" の 2 つのキーを持つ NSDictionary になります。

この構造からテーブル ビューを作成しても問題ありません。また、アセット タイプを CoreData からディクショナリのヘッダー キーにフェッチすることもできます。私が困惑しているのは、資産タイプが所有物に対して持っている対多関係をどのように利用して、所有物を辞書の配列に入れることができるかということです。

各資産タイプの所有物を配列に取得するにはどうすればよいですか?

アセット タイプが一致する所有物をフェッチするには、述語を使用してフェッチ リクエストを行う必要がありますか、それとももっと簡単な方法がありますか? ・全持ち物をチェックしてマッチさせると効率が悪い!?!?!?!?!

AssetTypeエンティティの対多関係「所有」は、AssetTypeエンティティのアクセス可能なプロパティですか? もしそうなら、どうすればアクセスできますか?それは何を返しますか?

私は無料のコードを探しているわけではありませんが、必要に応じて投稿したいと思っています。私が本当に望んでいるのは、この問題を解決する最善の方法を知り、これを達成するためにオンラインで役立つ情報を指摘することです. 私は完全な初心者ではありませんが、CoreData について理解するのにまだ苦労しており、これまでのところ、Apple のドキュメントはこの件に関して私をかなり混乱させています。提供されたヘルプに感謝します。

4

2 に答える 2

1

Xcode のデフォルト NSManagedObject テンプレートを使用して AssetType クラスを作成した場合 (画像を参照)

File/New/File.../Core Dats/NSManagedObject サブクラス

AssetType.h に次のようなものが必要です。

@interface AssetType : NSManagedObject

@property (nonatomic, retain) NSSet *possessions;

@end

@interface AssetType (CoreDataGeneratedAccessors)

- (void) addPossessionsObject:    (Possession *) value;
- (void) removePossessionsObject: (Possession *) value;
- (void) addPossessions:          (NSSet *) value;
- (void) removePossessions:       (NSSet *) value

@end

したがって、AssetType オブジェクトがある場合は、possessionsプロパティを介してそれに関連するすべての Possession オブジェクトにアクセスできます。ただし、デフォルトでは順序付けされていないため、これらのオブジェクトに配列としてアクセスするに-allObjectsは、セット内のオブジェクトを配列として返すセットのメソッドを呼び出してから、おそらくこれらのオブジェクトを何らかの方法で並べ替える必要があります。

編集:

また、その方法で NSManagedObject サブクラスを作成せず、possessionsプロパティがまだ実装されていない場合でも、上記の例で述べたのとまったく同じ方法でこのプロパティをクラスに追加し、AssetType.m 内に実装することができます。として@dynamic possessions

于 2012-04-11T16:26:16.320 に答える
0

私が読んでいることから、これはあなたが思っているよりもはるかに簡単だと思います。

UITableController の tableView:cellForRowAtIndexPath: メソッドで使用する辞書データ構造を使用することを想定しているように思えますが、おそらくまったく使用する必要はありません。

テーブル ビュー コントローラーをインスタンス化する場合 (viewDidLoad: がおそらく最も適切な場所です)、次のようなコードを使用してアセットを取得するだけです。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Asset" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // handle errors here
}

[fetchRequest release];

必要に応じて、fetchedObjects 配列を NSArray 型のインスタンス変数に割り当てて、テーブルを管理する UITableViewController クラスの複数の場所で参照できるようにします。次に、上記のコードの後、次のようなことができます。

self.assets = fetchedObjects;

アセット NSManagedObject のカスタム サブクラスを作成していない場合、配列内の各オブジェクトは NSManagedObject 型になり、その型の変数に読み込む必要があります。

資産に関連する所有物のリストが必要な場合、それは配列内の各資産オブジェクトに既に存在します (これが CoreData の優れた点です。実際にメモリ内でインスタンス化されていない場合、プロパティにアクセスしようとすると、CoreData は自動的にあなたのためにそれをインスタンス化します)。

したがって、NSManagedObject のカスタム クラスを定義していない場合、配列オブジェクトはその型になります。配列内の資産オブジェクトの 1 つを (適切な) 資産という名前のローカル変数に割り当てます。

たとえば、これはインデックス 0 のオブジェクトをローカル変数に割り当てます。

NSManagedObject *asset = [self.assets objectAtIndex:0];

次のコードで所有物のセットを取得できます。

NSSet *assetPossessions = [asset valueForKey:"@possessions"];

(xCode のモデル エディタで定義された関係が「possessions」と名付けられていると仮定します)

別の方法として、Asset NSManagedObject 用に独自のカスタム サブクラスを生成した場合は、次の例の方が適している可能性があります。

MyManagedAssetObject *asset = [self.assets objectAtIndex:0];
NSSet *assetPossessions = asset.possessions;

この例では、NSFetchedResultsController を使用していないと想定していることに注意してください。実際には、テーブルを使用してテーブルを管理する方が簡単ですが、プログラミングではよくあることですが、「あと 1 つだけ」ということを知ってから (逆説的に) 答えが複雑になります。あなたはそれについて言及しなかったので、私はあなたがそれを使用していないと仮定しました.

お役に立てれば。ポール

于 2012-04-11T16:56:54.873 に答える