0

私はインターネットでかなり検索しましたが、探しているものが見つかりません。

多くのユーザーになる可能性のあるこのモデルがあります。だから私はと呼ばれるエンティティを持っていますUser。ユーザーにはNSSetのレコードがあります。そして、特定のユーザーからレコードを取得したいと思います。私はこのようにしようとしていますが、それでもすべてのユーザーからレコードが返されます。

NSManagedObjectContext *context = _backgroundContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Record"
                                                  inManagedObjectContext:context];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@)",date];
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"User = %@",currentUser];

NSPredicate *predicates = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,predicate1, nil]];
[fetchRequest setPredicate:predicates];

[fetchRequest setPredicate:predicate];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

難しいことではないことはわかっていますが、それが何であるかを見つけることができません。あなたの何人かが助けてくれることを願っています. 前もって感謝します!

編集:

私が言ったように、私は次のものを持つエンティティUserを持っています:

NSString name,
int age,
NSSet records, ...

Record次のような独自のプロパティがあります。

NSDate date,
NSString name,
NSString event, 
...

特定のユーザーからのみレコードを取得するためのフェッチ要求を作成したいと考えています。すべてのユーザーからすべてのレコードを取得しているため、その方法がわかりません。

records には対多の関係があります。currentUser.records のようなレコードを取得できますが、record.User を使用してユーザーを取得できません。

4

4 に答える 4

2

あなたのモデルはおおまかに次のようになっていると思います。つまり、レコードの関係にはユーザーと呼ばれる逆の関係があります。

ユーザーレコードモデル

この関係は逆の関係であることが重要です。そうしないと、Core Data が自動的に維持しないからです。次に、次のように、指定された日付以降に指定されたユーザーのすべてのレコードをクエリできます。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Record"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"user = %@ AND (date >= %@)", currentUser, date];

NSError *error = nil;
NSArray *records = [_backgroundContext executeFetchRequest:fetchRequest error:&error];

NSLog(@"records: %@", records);

あなたのコードをよりコンパクトに書き直しましたが、重要な変更点は、クエリを一度に作成することです。

于 2014-02-21T14:35:26.633 に答える
1

エラーは次のとおりです。

[fetchRequest setPredicate:predicates];
[fetchRequest setPredicate:predicate];

複合述語を設定した後、述語 for datealone で上書きします。おそらく 2 行目を削除したいと思うでしょう。

編集:フェッチ要求では、逆の関係userRecordto に定義Userし、述語でこの関係の正確な名前を使用する必要があります。

User別の解決策は、からへの「前方」関係を使用してRecord、結果をフィルタリングすることです。

NSSet *records = [currentUser.records filteredSetUsingPredicate:predicates];

または、配列を好む場合

NSArray *records = [[currentUser.records allObjects] filteredArrayUsingPredicate:predicates];
于 2012-12-29T07:09:59.933 に答える
1

Martin R が言ったように、述語を置き換えています。彼も言及しているように、コアデータがこれを強制していると確信しているため、ユーザープロパティは小文字にする必要があります。大文字でリレーションシップを作成しようとするとエラーになるはずなので、試してみてください

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"user = %@",currentUser];

代わりは。明らかに、モデルがユーザーのプロパティを定義していない場合、それも機能せず、モデルが実際に持っているものに変更する必要がありますが、それ以外の場合は機能するはずです。

編集:

モデルに逆関係を追加してみてください。したがって、構造は次のようになります。

ユーザー

NSString name,
int age,
NSSet records, ...

記録

NSDate date,
NSString name,
NSString event, 
User user,
...

次に、新しいレコードを作成するたびに、ユーザー レコード セットにレコードを追加するだけでなく、レコード オブジェクトにもユーザーを設定します。これにより、レコードのフェッチが非常に簡単になり、コア データのデータの整合性を維持することもできます。

"You should typically model relationships in both directions, and specify the inverse 
relationships appropriately. Core Data uses this information to ensure the consistency of the 
object graph if a change is made"

(Core Data プログラミング ガイド)

これがセットアップされると、単純に呼び出すだけでレコードユーザーを簡単に取得できるはずですrecord.user

複数のレコードに複数のユーザーが必要な場合は、関係を対多関係として設定し、User userプロパティを に変更しますNSSet user

モデルをそれほど変更したくない場合は、あなたの質問に少し混乱しています。特定のユーザーのレコードを取得したいとおっしゃいましたか? user.recordsもしそうなら、その関係がすでに定義されているので、単に呼び出してみませんか? そのための全体的なフェッチ リクエストは必要ありません。コア データにそれを管理させてください。

その後、日付に基づいて結果の Records をフィルター処理する場合は、結果の配列に自分で述語を適用できます。これもフェッチ リクエストは必要ありません。

于 2012-12-29T07:32:27.400 に答える
0

探していたものを見つけました!これを使用して述語を形成する必要がありました

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF = %@",delegate.currentUser]; 

編集

まあ、私は間違っていたようです:/それはうまくいったようです。

于 2012-12-29T08:04:21.470 に答える