2

インデックスカードのメタファーを使用した、与えられたコアデータベースのアプリ。各インデックスカードは、オプションで、他の多くのエンティティ/テーブルと1対多の関係を持つことができます。つまり、Momentoの「Moment」をIndexcardオブジェクトのプロキシとして使用し、Momentoのタグや場所などの付属物をこれらの他のオブジェクト/テーブルのプロキシとして使用します。

これらの外部テーブルの関係がアプリ全体でおそらく最も重要なtableViewに存在するかどうかを示す「最速の」方法は何ですか?

関係が存在するかどうか、および各タイプの関係の数のカウントを示すセル部分をレイアウトするための最良のアプローチは何でしょうか?

ここでも、Momentoをデザインパターンとして使用します。Flickrのスクリーンショットへのリンク付き(私は初心者なので、stackOverflowでは画像を投稿できません)。

たぶん私の元RDBMSのものが私の考えを汚染しているのかもしれませんが、彼らは値を正しくするためにモンゴ結合をしませんでしたか?[タグ、イベント、人、場所]。私が見ているだけではない、よりエレガントな方法が必要です。

右側のセルをレイアウトするための私の考えは、YESがアイコンとカウントを表示する場合、ブール値を使用することでしたが、それはすべてのセルでかなり高価に思えます。

このレイアウトの質問に対する答えは、問題の最初の部分で採用されたアプローチによって決まると確信しています。メンテナンス上の理由から、「main/moment」IndexCardオブジェクトに補助的な関係を保存したくないようです。

助けてくれてありがとう。

4

1 に答える 1

1

インデックスカードとタグ(またはその他)の1対多の関係を設定する場合、フェッチされたインデックスカードオブジェクトには、プロパティとしてタグのNSSetが必要です。他の人も同じです。セットの数を取得して、適切な各アイコンの横に表示できるはずです。

..私があなたの質問を誤解していない限り。

編集:2番目の部分に答えるには、実際にcellForRowAtIndexパスに条件を設定して、各セットのカウントをチェックし、アイコンで表示するか(0の場合は通常は問題ありません)、それが正しいかどうかをチェックする必要があります。 0と言ったとおりの場合は、画像を非表示にします。セルがレンダリングされるまでにデータが既にフェッチされているため、どちらのソリューションでもアプリの速度が低下するとは思いませんが、0であるかどうかを確認せずにカウントを渡すだけのソリューションは、通常、全体的に高速です。 。

編集してサンプルコードを提供します 。CoreDataモデルには、IndexCardエンティティがあり、次に、関連する可能性のあるオブジェクトのタイプごとにエンティティがあります。

1)モデル:

IndexCard-他の各エンティティと1対多の関係があります

鬼ごっこ

位置

2)このモデルと対応するObjectクラスを作成すると、ヘッダーに次のようなIndexCardクラスが作成されます。

@property (nonatomic, strong) NSSet *tags
@property (nonatomic, strong) NSSet *locations
@property (nonatomic, strong) NSSet *people

そしてもちろん、その実装では次の

@dynamic tags
@dynamic locations
@dynamic people

3)このコアデータモデルが確立されたので、nsfetchrequestを実行できます(もちろん、テーブルビューを使用する場合は、テーブルをスクロールするときに必要なIndexCardを動的にフェッチするため、nsfetchedresultscontrollerを使用する必要があります)。このコードは、スコープ内に使用​​可能なNSManagedObjectContextがあり(理想的にはAppDelegateから渡され、ivarとして設定される)、IndexCardオブジェクトに検索可能な何らかのkey/idプロパティがあることを前提としています。これを「number」と呼びます。

NSNumber *numberWeWant = [NSNumber numberWithInt:1];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"IndexCard" inManagedObjectContext:ourContext];
request.predicate = [NSPredicate predicateWithFormat:@"number == %@", numberWeWant];

NSError *error = nil;

NSArray *results = [context executeFetchRequest:request error:&error];

//didn't bother error checking in case no IndexCard matches
IndexCard *ourCard = [results lastObject];

//you can now use these to display in the cell or hide the appropriate icons if they = 0
int numTags = ourCard.tags.count;
int numLocations = ourCard.locations.count;
int numPeople = ourCard.people.count;

//just a sample of how we would access the individual related objects
for(Tag *tag in ourCard.tags)
{
    //do whatever you want with each tag here
}

繰り返しますが、このコードは単一のIndexCardをフェッチするためのものです。実際のテーブルでは、nsfetchedresultscontrollerを含むビューをロードするときにnsfetchedresultscontrollerを初期化し、cellForRowAtIndexPathのIndexPath.rowに一致する位置でIndexCardにアクセスします。

これは、IndexCardが関連付けることができるオブジェクトのタイプが有限であることも前提としています。タイプがランダムに変化して増加する可能性がある場合は、このアプローチを変更する必要があります。

うまくいけば、これがお役に立てば幸いです。

于 2012-05-11T18:11:29.327 に答える