NSPredicate 内でフェッチされたプロパティを使用することについて質問があります (以下の「私の質問」を参照)。取得したプロパティを取得する述語についてではありません。明確にするために、またこの問題に直面する可能性のある他の人のために、小さなサンプルプロジェクトを作成しようとしました。
サンプルプロジェクト
iOS データ ストレージ ガイドラインに違反しているためにアプリが拒否されたため、Fetched Properties を使用する必要が生じました。QA1719には次のように書かれています。
アプリは、アプリ データとユーザー データを同じファイルに混在させないようにする必要があります。
これは、iCloud の同期を容易にするために必要であり、移行にも役立つ可能性があると思います。
それで、これを行う方法は?
最初の起動時にバンドル パスからコピーし、ユーザーの編集内容を保存するために使用したプリロードされた sqlite データベースを使用しました。プリロード データとユーザー データを混在させるべきではないため、それらを分離しようとしています。
主な問題は、異なるストア間で関係を持つことができないことです ( Cross-Store Relationships )。
Fetched Property Project のサンプルをまだ見つけていないので、自分で作成しようとしています。
サンプルには次のものがあります。
- 永続ストア Books.sqlite および
- 本をお気に入りの本にする方法。これは永続ストア UserData.sqlite に格納されます。
エンティティは次のとおりです。
-------------- --------------
| Books | | Favorite |
-------------- --------------
- author - favorite
- title --- 1 : 1 --- - books_title
エンティティ 'Books' は PreloadedData 用で、'Favorite' には UserData が含まれている必要があります。
Favorite-Tag は単なる例であり、ユーザーが作成したメモ (メモの述語が利用可能) である場合や、本が他の誰かにレンタルされている場合...
xcdatamodeld (Xcode エディター) で、2 つの構成 (PreloadStore、UserStore) を追加しました。それぞれに必要なエンティティのみが含まれます。
それらは一緒に使用されます(それ以外はすべてボイラープレートからのものです):
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
...
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"PreloadStore" URL:storeURL options:nil error:&error]) {
...
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"UserStore" URL:storeURLUserData options:nil error:&error]) {
述語を使用して、Books でフェッチされたプロパティ link_favorite を作成しました
books_title == $FETCH_SOURCE.title
サンプル プロジェクトは、ここからダウンロードできます。Predicate (Favorite books によるフィルター処理) を除いて、機能しています。
私の質問
お気に入りの本だけで、Books のフェッチをフィルター処理したいと思います。使ってみた
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"favorite_link.favorite == 1"];
(fetchedResultsController) に含まれMasterViewController.m
ていますが、これはクラッシュにつながるだけです。
ここのようなものをCOUNTまたはSUBQUERYで使用する必要があると思いますが、わかりませんでした。
よろしくお願いします。
- 編集:
私は単純な NSArray フェッチ (コア データ) を作成しました。ここでは次のように動作しています。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY link_favorite.favorite == 1"];
result = [result filteredArrayUsingPredicate:predicate];
しかし、NSFetchedResultsController の SUBQUERY でこれをどのように変換すればよいでしょうか (このブログ記事を試してみました)。間違っているのは:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contents, $x, $x.link_favorite.favorite == 1).@count > 0"]