1

NSPredicate 内でフェッチされたプロパティを使用することについて質問があります (以下の「私の質問」を参照)。取得したプロパティを取得する述語についてではありません。明確にするために、またこの問題に直面する可能性のある他の人のために、小さなサンプルプロジェクトを作成しようとしました。

サンプルプロジェクト

iOS データ ストレージ ガイドラインに違反しているためにアプリが拒否されたため、Fetched Properties を使用する必要が生じました。QA1719には次のように書かれています。

アプリは、アプリ データとユーザー データを同じファイルに混在させないようにする必要があります。

これは、iCloud の同期を容易にするために必要であり、移行にも役立つ可能性があると思います。

それで、これを行う方法は?

最初の起動時にバンドル パスからコピーし、ユーザーの編集内容を保存するために使用したプリロードされた sqlite データベースを使用しました。プリロード データとユーザー データを混在させるべきではないため、それらを分離しようとしています。

主な問題は、異なるストア間で関係を持つことができないことです ( Cross-Store Relationships )。

Fetched Property Project のサンプルをまだ見つけていないので、自分で作成しようとしています。

サンプルには次のものがあります。

  1. 永続ストア Books.sqlite および
  2. 本をお気に入りの本にする方法。これは永続ストア 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"]
4

2 に答える 2

0

サブクエリには、ここにはない関係が必要です。だから私の意見ではうまくいきません。fetchedResultsController のエンティティを切り替えて、fetched プロパティを介して必要なデータを関連する book オブジェクトに取得できます。時間を節約するために、(既に行っているように) 最も関連性の高いデータを保存して、お気に入りのオブジェクト内のテーブルビューに表示し、ユーザーがセルを選択して詳細ビューに移動した場合にのみ追加データを取得できます。

于 2012-06-27T08:03:06.400 に答える
0

最初の起動時にバンドル パスからコピーし、ユーザーの編集内容を保存するために使用したプリロードされた sqlite データベースを使用しました。

データがプリロードされた状態で出荷すること自体には何の問題もありません。おそらく、バンドル内の JSON ファイルを出荷し、最初のアプリの読み込み時に、それを解析して Core Data にインポートする必要があります。そうすることで、あなたがやろうとしていることは単純になり、Apple に不快感を与えることはありません。それを行うと、残りの質問は無関係になります。それを行う方法は複数あります。

また、Favorite を独自のエンティティにする理由はありますか? 「isFavorite」と呼ばれる本のエンティティにブール値を作成できないのはなぜですか?

于 2012-06-08T17:16:11.027 に答える