3

次のような小さな Core Data データベースを構築することができました。firstName、lastName、avatarImage、birthday などの属性を持つ「User」という名前のエンティティが 1 つ以上あります。

この「ユーザー」のもう 1 つの属性は、「アカウント」と呼ばれるエンティティとの対多関係です。このコンテンツを表示するために、UITableView を 2 つのセクションに分割した UIViewController をセットアップしました。1 つ目はすべての一般情報 (firstName、lastName) 用で、2 つ目はアカウントの NSSet (アカウントごとに 1 つのセル、それらの概要のみ) 用です。 .

ここまでは順調ですね :)

私の問題は次のとおりです。たとえば、テーブルビューの構築に不可欠な「カウント」プロパティを持つ辞書または配列に手動で追加することなく、最初のセクションの基本情報を取得するにはどうすればよいですか。さらに、エンティティの属性の一部に nil 値を設定することは正当である必要があります。このテーブル ビューは、プロパティ (self.userEntity ...) としてクラスに渡されるこの 1 つのエンティティを表示するだけで済みます。

私の言いたいことを理解し、いくつかのアイデアがあることを願っています:)

事前にThx

ダリオ

4

2 に答える 2

0

テーブル ビュー セルの追加、およびそれらの編集/削除に関心がある場合。あなたは間違いなくこのチュートリアルを見てください.私はこのチュートリアルを2回使用しました.コアデータを非常に速く理解することができました. 彼は素晴らしい先生!4 部構成のシリーズで、さまざまなビューにエンティティをロードする方法などを教えてくれます。

于 2012-11-30T01:45:14.840 に答える
0

「アカウント」の配列またはセットがあり、「アカウント」と対多関係にある「ユーザー」があり、指定されたアカウントのいずれかを持つ「ユーザー」のセットに効率的に到達したいですか?

キーと値のコーディング ソリューションは次のようになります。

NSSet *setOfAccounts = ...whatever...;

// assuming the to-one relationship from 'account' to 'user' is named 'user'
NSSet *setOfUsers = [setOfAccounts valueForKey:@"user"];

サブクエリを含まないソリューションを思いつくことはできませんが、コアデータクエリをどこかで提供する方が簡単な場合は、コアデータクエリを使用することもできます。

// assuming the to-many relationship from 'user' to 'account' is named 'accounts'
[NSPredicate predicateWithFormat:
               @"SUBQUERY(accounts, $x, %@ contains $x).@count > 0", accounts]

これは、キー値コーディング アプローチよりも遅くなる可能性があります。self in ...パフォーマンスが問題になる場合は、KVC アプローチを使用して一連のユーザーを取得し、関連するすべてのユーザーで失敗するようにフェッチ要求を実行することをお勧めします。

サブクエリの問題は、「に含まれる」ものNSPredicatecontainsないため、直接反転して次のようにすることはできないということです。

"any accounts isContainedIn %@", accounts

そうでなければ、より効率的な SQL にコンパイルされる可能性があります。元の述語が何であれ適応可能であれば、それを任意の操作として定式化する方が間違いなく効率的です。たとえば、次の場合:

/* accounts where ... */
"accountDate > %@", someDateInThePast

その場合、ユーザーにとって最速のクエリは次のようになります。

"any accounts.accountDate > %@", someDateInThePast

悲しいことに、複数のフィールドに一度に条件を適用するための適切な構文が「any」にはないと思います。許容できません。

于 2012-11-29T21:19:01.563 に答える