0

私はコアデータに次のような関係があります:

A -> B

および次の表:

A
----
id 
path
ref_foreignkey_B

B
----
id
name

問題は、外部キーがBオブジェクトとして設定されていることです(NSObjectから継承します)。

次に、特定のBオブジェクトへの参照が設定されているAからすべてのエントリをフェッチしようとしています。オブジェクトBは知っていますが、NSPredicate正しく設定する方法がわかりません。

私は以下を試しました:

NSString *complexPredicateFormat = [NSString stringWithFormat:@"ZREF_B == %@", self.B];   
NSPredicate *filter = [NSPredicate predicateWithFormat:complexPredicateFormat];
[fetchRequest setPredicate:filter];

...しかし、その結果、次のエラーが発生します。

'NSInvalidArgumentException', reason: 'Unable to parse the format string "ZREF_B == <B: 0x89d8300> (entity: B; id: 0x89d3ca0 <x-coredata://...

NSManagedObject更新された)を予測フィルター(where句を表す)として設定する方法を知っている人はいますか?

編集:ごめんなさい。もちろん、AとBはNSObjectではなくNSManagedObjectから継承します。

4

2 に答える 2

0

質問を理解できるかどうかはわかりませんが、「ref_foreignkey_B」がAからBの関係である場合、述語は次のようになります。

NSFetchRequest *fetch = [NSFetchRequest alloc] init];
fetch.entity = [NSEntityDescription entityForName:@"A" inManagedObjectContext:managedObjectContext];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];

NSError *error = nil
NSArray *array = [managedObjectContext executeRequest:fetch];
...
于 2012-05-16T11:28:57.970 に答える
0

ガブリエルの提案に基づく:

データモデルを作成しましたか?なぜあなたのエンティティはサブクラスNSObjectですか?

それで

ref_foreignkey_Bがエンティティの関係である場合は、B使用する必要があります

[NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];

明らかに、その述語を使用する場合は、に対してクエリを実行する(フェッチ要求を使用する)必要がありAますB

NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"A"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];

いくつかの注意事項

なぜ使うのZREF_B?これはsqliteファイルで作成された列です(私は推測します)。これを使用する必要はありませんが、データモデルで宣言されたプロパティ(属性または関係)のみを使用します。

ID、パス、およびAのref_foreignkey_B

BのIDと名前

Core Dataを扱うときは、db(sqliteなど)自体ではなく、オブジェクトグラフを扱います。これは理解すべき重要なポイントです。あなたはあなたのために作成されたsqliteファイル(例えば)を扱う必要はありません。作成したデータモデルでのみ。

さらに、からBへの逆の関係を作成することをお勧めしますA。これにより、オブジェクトグラフの整合性を維持できます。詳細については、Relationshipsをお読みください。

それが役に立てば幸い。

于 2012-05-16T11:29:32.997 に答える