問題タブ [fetched-property]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - Core Data は値の合計を取得します。フェッチされたプロパティと伝播
私はコアデータに比較的慣れていません(SQLiteのバックグラウンドから来ました)。「Core Data for iOS」の本を読み終えたばかりですが、次のモデルを持つアプリのモデリングを開始したときに、いくつかの不可解な質問が残っています。
- 対多の「トランザクション」関係と「startingBalance」プロパティを持つ「アカウント」エンティティ
- 対多の「支払い」関係を持つ「トランザクション」エンティティ (およびアカウントの逆)
- 実際に支払われた「金額」の詳細を含む「支払い」エンティティ
パフォーマンス上の理由から、モデルを非正規化し、「Accounts」エンティティに「TotalAmountSpent」プロパティを追加して (本で提案されているように)、何かが変更されたときに単純に更新し続けることができるようにしたいと考えました。
実際には、Core Data でこれを達成するのは難しいようです。これを適切に行う方法がわかりません(正しい方法がわかりません)。だから私の質問は:
a) 代わりに「TotalAmountSpent」を Fetched Property に変更する必要がありますか? パフォーマンスへの影響はありますか (遅延ロードされることはわかっていますが、すべてのアカウントでそのプロパティを取得することはほぼ確実です)。その場合、一定期間 (過去 3 日間など) の「startingBalance」に対する合計支出額を取得できる必要があります。これは SQL では簡単に思えますが、Core Data でこれを行うにはどうすればよいですか? @sum 集計関数を使用できることを読みましたが、@sum を使用して「日付」をフィルタリングするにはどうすればよいですか? また、データを変更するには、取得したプロパティを更新する必要があることも読みました。変更を「聞く」にはどうすればよいですか? 「Payment」エンティティの「willSave」メソッドで行うのですか?
b) 新しい支払いがトランザクションに追加されるたびに、伝播を使用して「TotalAmountSpent」を手動で更新する必要がありますか? これを行うのに最適な場所はどこですか?オーバーライドされた NSManagedObject の「willSave」メソッドでそれを行う必要がありますか? アカウントの「startingBalance」フィールドが更新された場合、対応するすべてのトランザクション/支払いを更新するのは悪夢になるのではないかと心配しています。次に、各支払いを読み込み、合計支出額とアカウントの最終残高を計算する必要があります。何千回も支払いがあったら怖い
この問題に関するガイダンスは大歓迎です。ありがとう!
core-data - xCode 4.2 コア データ データ モデル エディタで GUI を使用してフェッチされたプロパティを作成する方法は?
私はコアデータプログラミングに非常に慣れていません。エンティティがテーブルであることを理解しています。次のことを行いたいと思います。
1 つのテーブル「レコード」には、別のテーブル (「イベント」) に属性「recordID」があります。このレコードに関連付けられた一連のイベントがあり、それらすべてにも属性「recordID」があります。「レコード」テーブルには、これらのテーブル間の多くの「イベント」関係に対する 1 つのエントリがあり、「recordID」でリンクされています。
データ モデル エディタで GUI の [フェッチされたプロパティ] を使用して、レコードの現在のレコード ID の「イベント」の配列を取得する方法を知りたいです。
述語プログラミングガイドを確認したところ、次のようなことができると記載されています。
だからGUIで、私は使用することを考えていました
異なるテーブルを区別するにはどうすればよいですか? self.recordID = recordID か何か?
編集:関係の目的を完全に誤解していない限り。リレーションシップはテーブルを自動的にリンクしますか?
sorting - コア データのバックグラウンド ソート
Department
エンティティと 1 対多の関係を持つエンティティがありEmployee
ます。実行時に、オブジェクトごとに、さまざまなビュー オブジェクトでモデルとして使用されるオブジェクトの並べ替えられた配列 (いくつかの属性に従って並べ替えられた)Department
を維持したいと考えています。Employee
私が読んだことから、ソートされた配列を表す方法は 2 つあります。
Rep1 : フェッチされたプロパティを定義しますDepartment
(並べ替えは Core Data によって行われます)。
Rep2:sortedEmployees
Department で(オブジェクトの)インスタンス変数を維持しますNSArray
(ソートは私のコードによって行われます)。Employee
今、私の本当の問題は、アプリの起動時に永続的なストアから多数のDepartments
とをフェッチすることです。Employees
UI をブロックしないように、バックグラウンドで並べ替えを実行したい。
私はいくつかの方法を試しましたが、すべて無駄になりました:
Method1 ( Rep1 を使用) : バックグラウンド スレッドで ( を使用NSOperationQueue
)、すべてDepartments
をフェッチしてから、それぞれのフェッチされたプロパティを実行します。次に、メイン スレッドに戻り、Department
メイン スレッドのマネージド オブジェクト コンテキスト ( MOC ) で ( NSManagedObjectIDによって) 対応するオブジェクトを見つけ、取得したプロパティを使用します。Method1 の問題: メイン スレッドの Department オブジェクトでフェッチされたプロパティは、バックグラウンドの Department のフェッチが完了した後でも設定されません。つまり、メイン スレッドの Department で再フェッチされます。これは、バックグラウンド フェッチの目的全体を無効にします。フェッチされたプロパティが一度フェッチされると、すべての MOC に存在すると仮定するのは間違っていますか?
Method2 ( Rep2 を使用) : バックグラウンド スレッドで ( を使用NSOperationQueue
)、 all をフェッチしてDepartments
から、それぞれのsortedEmployees
配列を計算します。次に、メイン スレッドに戻り、メイン スレッドのMOCで( NSManagedObjectIDによって)対応する Department オブジェクトを見つけ、前述の配列をこのオブジェクトに設定します。Method2 の問題:sortedEmployees
配列内のオブジェクトは、バックグラウンド スレッドのMOCEmployee
に属するオブジェクトです。メインスレッドが後でそれらにアクセスしようとすると、次のようなクラッシュが発生します。 これは、各スレッドが独自の MOC (および関連する管理対象オブジェクト) を持っている必要があるためです。"NSManagedObject with ID ... has been invalidated."
管理対象オブジェクトがスレッドの境界を越えて存在できない場合、管理対象オブジェクトをバックグラウンドでどのようにソートするのでしょうか? 何か不足していますか?
ios - iOSコアデータのi18n
iOS 用にローカライズされたスキーマに取り組んでいます。翻訳されたフィールドを持つことができるさまざまなエンティティがあるため、それぞれに対してTranslationエンティティを作成します。2 つのエンティティーの間には常に 1 対多の関係があり、将来的に新しい言語を追加できるようになり、Entity.translationsを介して翻訳にアクセスできます。ここまでは順調ですね。
1) まず、そのようなアプローチが良いかどうか知りたいです。純粋な SQL 環境で使用するソリューションなので、その道をたどることができると思います。
Entity.text
2)それから...私は(経由で)ユーザーに適切なテキストを表示するために使用したいと思いますNSLocale preferredLanguages
。translations
戻り値としてNSSet
、エンティティ モデルに属性を手動で追加し、ゲッターを変更するという 1 つのオプションがあります。
それは機能しますが、意味がありますか?パフォーマンスの問題はありますか? Fetched propertiesを使用して同様のことを行うことは可能ですか? 可能であるとのことですが、Xcode Core Dataエディターを使用して機能させることはできません...
ありがとう。
ios - 不適切なカウントを返すコア データのフェッチされたプロパティ
私はこのようなコアデータ関係を持っています
アイテムA ->> アイテムB
itemAには多くのitemBがあります。「2」に設定されたint32ステータスプロパティを持つitemAに関連付けられたitemBに関連付けられたすべてを取得できるフェッチされたプロパティを使用したかったのです。そこで、データモデラーでフェッチされたプロパティを作成しました。これには次のものがあります。
取得したプロパティ: completedItem 述語: status == 2 宛先: itemB
最初に試してみたとき、アイテムが戻ってきて、それはすべてクールで完了したと思いましたが、後で奇妙な動作に気付き、返されたアイテムをよく見ると、関連するアイテムBの実際の量を処理するものは何もありませんでしたitemA オブジェクト。さらに奇妙なのは、戻り値の型が NSFaultingMutableArray であることです。ここに簡単な例があります
- アイテムAにはアイテムBが0個あります
- ItemA が ItemB の NSSet プロパティでフィルター処理された述語検索を実行すると、0 が返されます。
- フェッチされたプロパティ「completedItem」は ItemB の 4 を返します
- 返される型は NSFaultingMutableArray です
これは今の私の頭の中で奇妙で、本当に意味がありません。何か案は?
更新 1:
ここにリストされているフェッチされたプロパティは、問題の ItemA に関連付けられていなくても、述語に一致するコア データが提供する必要があるすべてのItemB オブジェクトを取得するようです。
core-data - Xcode 4.2.1 Core Data Model Editor を使用して、取得したプロパティの述語を更新するにはどうすればよいですか?
Xcode 4.2.1 の Core Data Model Editor で述語を編集する場合、更新された述語をどのように保持しますか? 述語の値を変更しても持続しないようです。元の述語は、フェッチされたプロパティに引き続き適用されます。
再現する手順:
- 取得したプロパティを作成します (例: 関連するエンティティ ページを持つエンティティ Book の oddPages)
- 述語を book == $FETCH_SOURCE && isEven != 0 に設定し
ます。 . Page エンティティには、pageNumber に基づいてページが作成されるときに設定される属性 pageNumber と属性 isEven もあります。この手順では、述語のロジックが意図的に正しくありません。) - ビルド、実行、および停止。「isEven == 0」を反映するように述語を修正します。
- ビルドして再度実行します。取得されたプロパティに対して取得された結果は、元の述語からのものであることに注意してください。
これはバグですか、それとも Core Data Model Editor を使用してフェッチされたプロパティの述語を更新するための重要な手順が欠けていますか?
xcode4 - 再帰基準または Fetched プロパティを持つ NSFetchRequest
親(逆の子)と呼ばれる再帰関係を持つエンティティタイプ Node があります。ここで、特定のノード (つまり、ブランチ ルート ノード) の他のエンティティの下に直接または間接的にあるすべてのエンティティを取得したいと考えています。
よくわからなかったので、特定のブランチ ルート ノードに設定されたエンティティを 1 つだけ保持するエンティティ タイプ Node へのリレーションシップ ノードを持つエンティティ タイプ Position を作成しました。
Node で、node.parent == position.branchRootNode OR node.parent.isBelowBranchRootNode の場合に true になる Fetched Property isBelowBranchRootNode を作成したいと考えています。
私はそれを働かせることができません。より良いアイデアも大歓迎です。
ios - フェッチされたプロパティを作成して、最小限のフィールドでエンティティを取得するにはどうすればよいですか?
この問題を解決できません... フェッチされたプロパティ (フェッチされたリクエストではなく) に問題があります。
フェッチされたプロパティを作成して、最小限のフィールドでエンティティを取得するにはどうすればよいですか? これらのキャプチャを見ると、次のことがわかります。
取得した minItemTimestamp というプロパティに何を書けばいいですか? いくつかのオプションを試しましたが、うまくいきません。"@min.items.timestamp" "items.@min.timestamp" @min は集計のようで、探しているものかどうかわかりません。
この返信を試しましたが、うまくいきませんでした: Fetched Property in XCode Data Model Editor for minimum value
では、取得したプロパティを作成して、現在のカテゴリ (タイムスタンプが最小のカテゴリ) に属するすべてのアイテムから取得できますか?
どうもありがとう、私はあなたの助けに感謝します。
iphone - フェッチされたプロパティ - 述語
NSPredicate 内でフェッチされたプロパティを使用することについて質問があります (以下の「私の質問」を参照)。取得したプロパティを取得する述語についてではありません。明確にするために、またこの問題に直面する可能性のある他の人のために、小さなサンプルプロジェクトを作成しようとしました。
サンプルプロジェクト
iOS データ ストレージ ガイドラインに違反しているためにアプリが拒否されたため、Fetched Properties を使用する必要が生じました。QA1719には次のように書かれています。
アプリは、アプリ データとユーザー データを同じファイルに混在させないようにする必要があります。
これは、iCloud の同期を容易にするために必要であり、移行にも役立つ可能性があると思います。
それで、これを行う方法は?
最初の起動時にバンドル パスからコピーし、ユーザーの編集内容を保存するために使用したプリロードされた sqlite データベースを使用しました。プリロード データとユーザー データを混在させるべきではないため、それらを分離しようとしています。
主な問題は、異なるストア間で関係を持つことができないことです ( Cross-Store Relationships )。
Fetched Property Project のサンプルをまだ見つけていないので、自分で作成しようとしています。
サンプルには次のものがあります。
- 永続ストア Books.sqlite および
- 本をお気に入りの本にする方法。これは永続ストア UserData.sqlite に格納されます。
エンティティは次のとおりです。
エンティティ 'Books' は PreloadedData 用で、'Favorite' には UserData が含まれている必要があります。
Favorite-Tag は単なる例であり、ユーザーが作成したメモ (メモの述語が利用可能) である場合や、本が他の誰かにレンタルされている場合...
xcdatamodeld (Xcode エディター) で、2 つの構成 (PreloadStore、UserStore) を追加しました。それぞれに必要なエンティティのみが含まれます。
それらは一緒に使用されます(それ以外はすべてボイラープレートからのものです):
述語を使用して、Books でフェッチされたプロパティ link_favorite を作成しました
サンプル プロジェクトは、ここからダウンロードできます。Predicate (Favorite books によるフィルター処理) を除いて、機能しています。
私の質問
お気に入りの本だけで、Books のフェッチをフィルター処理したいと思います。使ってみた
(fetchedResultsController) に含まれMasterViewController.m
ていますが、これはクラッシュにつながるだけです。
ここのようなものをCOUNTまたはSUBQUERYで使用する必要があると思いますが、わかりませんでした。
よろしくお願いします。
- 編集:
私は単純な NSArray フェッチ (コア データ) を作成しました。ここでは次のように動作しています。
しかし、NSFetchedResultsController の SUBQUERY でこれをどのように変換すればよいでしょうか (このブログ記事を試してみました)。間違っているのは:
cocoa - CoreDataクロスストレージフェッチプロパティ
私は現在、CoreDataに関するいくつかの問題に頭を悩ませています。フレームワークが付属しているため、自分のストアに1つのユーザーモデルがありますが、これを制御することはできません。このモデルの永続ストアコーディネーター、管理対象オブジェクトモデル、およびコンテキストは自動的に作成され、タッチすることはできません。その中で、このモデルには単一のユーザーエンティティがあります
一方、私は完全に制御できるプロパティエンティティを含むプロパティモデルを持っています。そこで、いくつかのユーザーエンティティのプロパティを他のストアに保存します。ユーザーエンティティとプロパティエンティティの両方に、外部キーと同様のid属性があります。このモデルには、独自の永続ストアコーディネーター、管理対象オブジェクトモデル、およびコンテキストがあります。
私が今欲しいのは、関連付けられたユーザーエンティティをプロパティエンティティの属性として持つことです。これにより、次のようなキーパスにバインドできるようになりますmyproperty.user.someValueOfTheUserEntity
(フェッチされたプロパティを使用する場合、mypropertyが配列になる可能性があることを認識しています)。
ただし、ストア間の関係はサポートされていないため、 FetchedPropertiesを介して弱い関係を使用することを考えました。これは、対応する2つのid属性と一致する必要があります。XcodeでユーザーのFetchedプロパティを作成し、プロパティエンティティのクラスファイルで必要なアクセサーを作成しました(他の質問で提案されているように、Fetchedプロパティによって返される値を配列として扱っています)。
ただし、ターゲットエンティティは完全に異なるストアに存在するため、Xcodeでフェッチされたプロパティの宛先エンティティを設定できません。プロパティストアでユーザーエンティティも定義する必要がありますか?もしそうなら、Core Dataは、そのエンティティが私のプロパティストアからではなく、ユーザーストアからフェッチされることをどのように認識しますか?
一部のスレッドでは、このための構成の使用について言及していますが、「このための構成の使用」について言及している以上のドキュメントは見つかりません。
誰かがクロスストレージフェッチプロパティを設定する方法について教えてもらえますか?#