問題タブ [nsfetchedresultscontroller]
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 - iPhone 連絡先アプリ スタイルのインデックス付きテーブル ビューの実装
私の要件: インデックス タイトルがアルファベットの開始文字であるインデックス付きテーブル ビューに、人の名前をアルファベット順にリストするという単純な要件があります (さらに、上部に検索アイコンと、数字で始まるその他の値を表示するための # があります)。およびその他の特殊文字)。
これまでに行ったこと: 1. ストレージにコア データを使用しており、「last_name」は連絡先エンティティの文字列プロパティとしてモデル化されています 2. NSFetchedResultsController を使用して、並べ替えられたインデックス付きテーブル ビューを表示しています。
要件を達成するための問題: 1. まず、セクション インデックスのタイトルをアルファベットの最初の文字にすることができませんでした。次の投稿でのデイブの提案は、同じことを達成するのに役立ちました:文字列の最初の文字によって作成されたセクションを持つ NSFetchedResultsController
Dave の提案で遭遇した唯一の問題は、"#" インデックスの下にグループ化されたその他の名前を取得できなかったことです。
私が試したこと: 1.カスタム比較メソッドを NSString (カテゴリ) に追加して、比較とセクションがどのように行われるかを確認しようとしましたが、NSSortDescriptor セレクターで指定されたときにそのカスタムメソッドが呼び出されません。
ここにいくつかのコードがあります:
データを取得するコード:
不足しているものと、要件をどのように達成できるか教えていただけますか?
iphone - iPhone: フェッチされた結果コントローラー、UITableView でセクションを使用しない
私はフェッチされた結果コントローラーを使用しています。これは、UITableView のセクションを使用してセットアップしたいようです。この場合、セクションを使用したくありません。numberOfSectionsInTableView: の値を 1 に設定するのは簡単です。しかし、numberOfRowsInSection: を取得してすべてのセルを 1 つのセクションに戻す方法がわかりません。
1 つのセクションのみを使用したいので、そのメソッドがすべてのセルを返すようにするにはどうすればよいですか?
iphone - NSManagedObjectContext は自動保存されていますか、それとも NSFetchedResultsController のキャッシュを見ていますか?
メイン テーブル ビュー コントローラーで NSFetchedResultsController を使用する iPhone アプリを開発しています。メイン テーブル ビュー コントローラーの viewDidload で次のように作成します。
次に、後続のビューで、コンテキストに新しいオブジェクトを作成します。
TestObject にはいくつかの関連オブジェクトがあり、これらを同じ方法で作成し、提供された add...Objects メソッドを使用して testObject に追加します。
次に、コンテキストを保存する前にキャンセルを押してメイン テーブル ビューに戻ると、期待どおりに何も表示されません。ただし、アプリを再起動すると、コンテキストで作成したオブジェクトがメイン テーブル ビューに表示されます。どうして?最初は、NSFetchedResultsController がキャッシュから読み取っていたためだと思いましたが、ご覧のとおり、テストのためにこれを nil に設定しました。また、[context hasChanges] は、再起動後に true を返します。ここで何が欠けていますか?
iphone - NSFetchedResultsControllerを使用したバックグラウンド変更の処理
NSFetchedResultsControllerとCoreDataでいくつかの厄介な問題が発生しています。いずれも、助けを得ることができて非常にありがたいです。
問題1-更新:バックグラウンドスレッドでストアを更新すると、特定の行が削除、挿入、または更新されます。変更は、「mergeChangesFromContextDidSaveNotification:」メソッドを使用してメインスレッドのコンテキストにマージされます。挿入と削除は適切に更新されますが、更新は更新されません(たとえば、セルラベルは変更によって更新されません)。ただし、挿入と削除とまったく同じように、contextDidSaveNotifcationを介して更新が行われることを確認しました。私の現在の回避策は、コンテキストの失効間隔を一時的に0に変更することですが、これは理想的な解決策ではないようです。
問題2-オブジェクトの削除:フェッチバッチサイズは20です。最初の20行にあるバックグラウンドスレッドによってオブジェクトが削除された場合、すべてが正常に機能します。ただし、オブジェクトが最初の20行の後にあり、テーブルが下にスクロールされると、「CoreDataは障害を実行できませんでした」というエラーが発生します。コンテキストを再保存し、frcフェッチを再実行しようとしましたが、まったく役に立ちませんでした。注:このシナリオでは、frcデリゲートメソッド「didChangeObject ....」は削除のために呼び出されません。これは、問題のオブジェクトがその時点で障害が発生していなかったためであると考えられます(初期フェッチ範囲外であったため)。 )。しかし、何らかの理由で、コンテキストはオブジェクトが存在すると見なしますが、はストアから削除されています。
問題3-セクションの削除:行を削除するとセクションが削除される場合、「セクション内の行数が無効ですか?」というメッセージが表示されます。エラー。NSFetchedResultsChangeMove:セクションから「reloadSection」行を削除して「[tableViewinsertRowsAtIndexPaths ....」に置き換えることでこれを回避しました。これは機能しているようですが、これが最善の解決策かどうかはわかりません。
どんな助けでも大歓迎です。ありがとうございました!
iphone - NSFetchedResultsController が特定のセクション駆動の動きを処理していない
Core Data ストアで NSFetchedResultsController (frc) を利用しています。すべての frc デリゲート メソッドを実装します。テーブルは、バックグラウンド スレッドによって散発的に更新されます。すべての挿入、削除、および更新は正常に機能しますが、テーブルの下部 (50 行) に向かう行の frc のインデックス キーへの更新はセクションの移動にはなりません。たとえば、"name" がインデックス キーで、"Victor" という名前が "Alex" に変更された場合、勝者の行には Alex という名前が表示されますが、A で始まる他のすべての名前と一緒にテーブルの一番上に移動することはありません。これは、テーブルの下部にある行のみを対象としていることに注意してください。「Andy」のような行が「Ben」に変更された場合、移動は実際に frc によって正しく処理されます。これを修正するための提案をいただければ幸いです。私は frc キャッシュを使用しません。ありがとう
iphone - UITableView に行を追加するときの表示シフト
基になるNSFetchedResultsControllerを表示するUITableViewがあります。
fetchedResultsController が更新されると、
と呼ばれます。そして、以下が実行されます。
cellForRowAtIndexPath は、新しい行に対してのみ呼び出されます (これは論理的です)。
ただし、問題は、テーブル ビューの行に表示されるすべての値が下に移動することです。最初の行にはそのタイトルが表示されます。2 行目には、1 行目のタイトルが表示されます。3 行目に 2 行目のタイトルなど。それを繰り返すと、3 行目には 2 行目のタイトル、4 行目には 3 行目のタイトルなどが表示されます。
特に cellForRowAtIndexPath は新しい行 (論理的) に対してのみ呼び出され、これらすべての行に対して呼び出されるわけではないため、何が起こるかわかりません。さらに、間違ったタイトルの行をクリックすると、正しいドキュメントが開きます (didSelectRowAtIndexPath は indexPath で正しく機能します)。
何が起こるかの手がかりはありますか?ありがとう!
iphone - UITableViewControllerなしでNSFetchedResultsControllerを使用することは意味がありますか?それらはどのように関連していますか?
つまり...単純な古いUIViewControllerを作成してから、UITableViewとNSFetchedResultsControllerを自分で設定することもできますか?
UITableViewControllerとNSFetchedResultsControllerはどのくらい相互作用しますか?私が見る限り、UITableViewControllerは、デフォルトではNSFetchedResultsControllerDelegateプロトコルをすでに採用していません。NSFetchedResultsControllerについて知らなくても、UITableViewControllerが開発されたように見えます。おそらく彼らはFRCを開発する前にそれさえしました。とにかく、UITableViewControllerにはFRCについての言及がまったくないため、単なる推測です。
したがって、UITableViewControllerに表示されるのは、プロトコルを採用することでUITableViewのデリゲートになっていることと、UITableViewインスタンスをセットアップし、そのtableViewプロパティに内部的に割り当てることだけです。それはUITableViewControllerの魔法全体ですか?
(注:nsfetchedresultscontrolleタグはタイプミスではありません。したがって、文字数に制限があります...その欠落しているrにはあまりにも悪いので、ペストのような他の多くの質問でこのタグを避けました)
iphone - フェッチされた結果コントローラーのソート記述子を動的に変更する
iOSでフェッチされた結果コントローラーに対してソート記述子を動的に設定する方法はありますか?
たとえば、ナビゲーションタイトルバーのセグメント化されたコントロールの設定に基づいて、コアデータの結果を並べ替えて返す必要があります。ユーザーは、セグメント化されたコントロールをクリックして、価格または優先度で並べ替えることができます。
次に、そのセグメント化された制御値に基づいてセクションにソートされたコアデータ情報を返し、表示するために、フェッチされた結果コントローラーが必要です。
ソート記述子を最初に設定する方法は知っていますが、動的に変更/更新する方法がわかりません。関数は遅延ロードされるので- (NSFetchedResultsController *)fetchedResultsController
、最初に作成されたfrcを常に返すだけでしょうか(したがって、最初のソート記述子設定を返します)?
セグメント化されたコントロール値をsharedPreferencesに保存し、それが変更されたときに、fetchedResultsControllerをnilに設定して、新しい値が生成されるようにしますか?次に、fetchedResultsController関数内で、そのsharedPreferences設定に基づいてsortDescriptorを作成できますか?
iphone - UITableViewController または NSFetchedResultsController を更新するには?
UITableViewController または NSFetchedResultsController に少し問題があります。どちらが問題なのかはわかりませんが、UITableViewController だと思います。
前述したように、NSFetchedResultsController を使用してデータを UITableViewController に入力します。データは日付でソートされ、2010 年 5 月/2010 年 6 月などの日付-年ごとのセクションにも表示されます。これは、セクション ヘッダーとして表示されます。
新しいデータを追加すると、現在の日付がデフォルトとして自動的に使用されますが、現在セクション リストにない日付を使用する場合、たとえば 2010 年 4 月 (現在、リストには 5 月と 6 月)、これは次のようになります。正しく表示されません。アプリを終了して再度起動すると、新しいセクション ヘッダーが表示され、すべて問題ありません。
そのため、どういうわけかリストを更新または更新できる必要があります。コンテキストに追加して変更するだけでは、更新されないようです。
繰り返しますが、それが NSFetchedResultsController オブジェクトまたは UITableViewController である場合、何を更新する必要があるかわかりません。
更新#1:
このメソッドには例外があると思いました:
これは私がデータを移動する場所です:
このメソッドは、Apple の CoreDataBooks の例からほとんど取られています。そして、これはエラーです:
重大なアプリケーション エラーです。-controllerDidChangeContent: の呼び出し中に、NSFetchedResultsController のデリゲートから例外がキャッチされました。*** -[NSMutableArray removeObjectAtIndex:]: userInfo (null) の範囲 [0 .. 0] を超えるインデックス 1
その後、編集モード (削除ボタンが表示される場所) が機能しなくなります。
ありがとう。
iphone - EXC_BAD_ACCESS NSArray of ManagedObjects (コア データ)
私のiPhoneアプリで何か奇妙なことが起こっています。Core Data を使用して SQLite データベースにデータを保存しています。アプリの起動後初めて、テーブルを読み取ってすべての行を返し、ユーザーが選択できるもののリストを UITableView に入力しようとしました。リストの一番上の項目を選択すると、EXC_BAD_ACCESS 例外が発生します。彼らが他のアイテムを選択した場合、すべて問題ないようです。コード サンプルは次のとおりです。Sport と Team は NSManagedObjects です。sports は、NSFetchedResultsController (fetchedObjects) を使用してフェッチされた Sport オブジェクトの NSArray です。オブジェクトのリストを UITableView に表示できます (問題なく cellForRowAtIndexPath() 呼び出しに同じ配列を使用します)
更新: EXC_BAD_ACCESS エラーがスローされるまで、最初のレコードではなく、NSArray の最後のレコードにのみ影響するようです。アプリを再起動すると、問題はなくなり、コードは期待どおりに機能します:(