問題タブ [android-cursorloader]

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.

0 投票する
1 に答える
1674 参照

android - CursorLoader で所有者のメール アドレスを取得する

ArrayList に所有者の電子メールを入力しようとしています。私はこれを断片的にやっています。これが私のコードです:

私は基本的にここで与えられた例を使用しました。それをフラグメントに適応させただけです。

フラグメントがランチされると、アプリがクラッシュし、次のエラーが発生します。

(私のデバイスには 1 つの Gmail アカウントがあります)

0 投票する
1 に答える
459 参照

android - アセットからのデータベースを使用した CursorAdapter

事前に作成したアプリケーションでデータベースを使用し、カーソルローダーを使用してデータベースからデータを表示したいと考えています。最初に、このチュートリアル [http://goo.gl/1XS84] に従ってアセット フォルダーからデータベースをコピーしてから、CursorAdapter で CursorLoader を使用します。

ただし、CursorLoader にはデータベースのクエリ URI が必要ですが、どの URI を指定すればよいかわかりません。何か助けはありますか?

0 投票する
5 に答える
10357 参照

android - カスタム CursorLoader と ListView をサポートする CursorAdapter の間でデータが同期していない

バックグラウンド:

CursorLoaderを使用する代わりに、SQLite データベースで直接動作するカスタムがありContentProviderます。このローダーは、 にListFragment裏打ちされた で動作しCursorAdapterます。ここまでは順調ですね。

簡単にするために、UI に [削除] ボタンがあると仮定します。ユーザーがこれをクリックすると、DB から行を削除onContentChanged()し、ローダーも呼び出します。また、onLoadFinished()コールバック時にnotifyDatasetChanged()、UI を更新するためにアダプターを呼び出します。

問題:

削除コマンドが立て続けに実行される場合、つまり が立て続けにonContentChanged()呼び出されると、bindView()古いデータを操作することになります。これは行が削除されたことを意味しますが、ListView はまだその行を表示しようとしています。これにより、カーソル例外が発生します。

私は何を間違っていますか?

コード:

これはカスタムの CursorLoader です ( Diane Hackborn 氏によるこのアドバイスに基づく)

コールバックListFragmentを示すクラスのスニペット。LoaderManagerユーザーがレコードを追加/削除するたびにrefresh()呼び出すメソッド。

Myは、オーバーライドされて新しく膨張した行レイアウト XML を返し、を使用して列を行レイアウトの s にバインドするCursorAdapter通常のものです。newView()bindView()CursorView


編集1

これを少し掘り下げた後、ここでの根本的な問題は、CursorAdapterが基になる を処理する方法だと思いますCursor。私はそれがどのように機能するかを理解しようとしています。

理解を深めるために、次のシナリオを取り上げます。

  1. がロードCursorLoaderを終了しCursor、現在 5 行の を返しているとします。
  2. Adapterは、これらの行の表示を開始します。を次の位置に移動しCursorて呼び出すgetView()
  3. この時点で、リスト ビューがレンダリング中であっても、行 (_id = 2 など) がデータベースから削除されます。
  4. これが問題です-が削除された行に対応する位置にCursorAdapter移動しました。CursorメソッドはbindView()引き続き this を使用してこの行の列にアクセスしようとしますがCursor、これは無効であり、例外が発生します。

質問:

  • この理解は正しいでしょうか?上記のポイント 4 に特に興味があります。ここでは、行が削除されたときに、Cursor要求しない限り更新されないという仮定を立てています。
  • これが正しいと仮定すると、進行中CursorAdapterのイベントのレンダリングを破棄/中止し、代わりに新鮮な( andを介して返される) を使用するように依頼するにはどうすればよいですか?ListView CursorLoader#onContentChanged()Adapter#notifyDatasetChanged()

PSモデレーターへの質問: この編集は別の質問に移動する必要がありますか?


編集2

さまざまな回答からの提案に基づいて、 s がどのように機能するかについての私の理解に根本的な誤りがあったようLoaderです。次のことがわかります。

  1. FragmentまたはAdapterを直接操作するべきではありませんLoader
  2. はデータのすべてのLoader変更を監視し、データが変更されるたびAdapterに新しいものを提供する必要があります。CursoronLoadFinished()

この理解を武器に、次の変更を試みました。- 一切の操作はありLoaderません。現在、refresh メソッドは何もしません。

Loaderまた、と の内部で何が起こっているかをデバッグするためContentObserverに、次のように思いつきました。

Fragmentそして、ここに私のとのスニペットがありますLoaderCallback

これで、DB に変更 (行の追加/削除) があるたびに、のonChange()メソッドをContentObserver呼び出す必要があります - 正しいですか? 私はこれが起こっているのを見ません。私ListViewの変化は決して見られません。変更が見られるのは、 を明示的に呼び出しonContentChanged()た場合だけLoaderです。

ここで何がうまくいかないのですか?


編集3

Loaderわかりましたので、から直接拡張するように書き直しましたAsyncTaskLoader。DB の変更が更新されていることも、DB に行を挿入/削除するときに呼び出されるonContentChanged()メソッドも表示されません:-(Loader

いくつかのことを明確にするために:

  1. のコードを使用しCursorLoaderCursor. ここで、 への呼び出しをContentProvider自分のDbManagerコードに置き換えました (次に、 を使用DatabaseHelperしてクエリを実行し、 を返しますCursor)。

    Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();

  2. データベースでの挿入/更新/削除は、Loader. ほとんどの場合、DB 操作はバックグラウンドServiceで行われ、いくつかのケースではActivity. DbManagerクラスを直接使用してこれらの操作を実行します。

私がまだ得ていないのは、行が追加/削除/変更されたことを誰が教えてくれるのですか? Loader言い換えれば、どこでForceLoadContentObserver#onChange()呼ばれますか?ローダーで、オブザーバーを次の場所に登録しますCursor

Cursorこれは、変更されたときに通知する責任があることを意味しmObserverます。しかし、私の知る限り、「カーソル」は、DBでデータが変更されたときに、それが指しているデータを更新する「ライブ」オブジェクトではありません。

これが私のローダーの最新の反復です。

0 投票する
1 に答える
95 参照

android - 検索可能なアクティビティでのCursorLoaderの使用

アクションバーで使用する検索可能なアクティビティを作成しようとしています。ContentProviderからのデータを提供するCursorAdapterがあります。

私が理解するのに苦労しているのは、APIの例、つまりsearchableDictonaryが、CursorLoadersと非同期で何かを実行する代わりに、managedQueryを実行する理由です。

おそらく私は何かが欠けていますか?

0 投票する
1 に答える
1374 参照

android - カーソルローダーからのListFragmentは、方向の変更時に何も表示されません

私は、Android互換ライブラリを使用して、minSDKが8(Android 2.2)およびtargetSDKが16(Android 4.1)のActionBarSherlockおよびViewPagerIndicatorで構築されたAndroidアプリケーションに取り組んでいます。メッセージがSQLiteデータベースに保存されるアプリのメッセージング部分があり、CommonsWareのcwac-loaderexを使用してSQLiteデータベースでカーソルローダーを使用しています。アクティビティが読み込まれると、すべてが正常に機能し、メッセージが表示されますが、デバイスを回転すると、読み込み中のcicleを含むListFragmentが表示されます。

LoaderManager.enableDebugLogging(true)をオンにすると、回転時に既存のローダーが再利用されます。onDestroyでgetSupportLoaderManager()。destroyLoader(ID)も試しましたが、新しいローダーが作成されていますが、同じ結果が得られます。 。メッセージングアクティビティを開く前に両方の方向でテストしましたが、どちらも正常に機能します。メッセージングアクティビティが表示されているときに回転すると問題になります。また、縦向きでメッセージングアクティビティにアクセスし、メッセージングアクティビティを破棄せずに別のアクティビティに移動するメッセージをクリックし、横向きに変更してからメッセージングアクティビティに戻ると、すべてが正常に表示されます。

ローテーション後にメッセージが表示されない理由を理解できませんでした。私はどんなアイデアや助けにもとても素晴らしいと思います。以下に私のメッセージ活動を含めました。

0 投票する
1 に答える
2149 参照

android - AndroidSimpleCursorAdapterからCursorAdapterへ

SimpleCursorAdapterデータベースへのクエリを管理し、結果をで表示するために使用していますListView

これが私のコードです:

一見、期待通りに動作しているように見えますが、あるのでこれが進むべき道ではないと思いますCursorAdapter

これは初心者の質問であることは知っていますが、Androidでプログラミングを始めたばかりなので、まだよくわかりません。

SimpleCursorAdapterこれを使用からに渡すにはどうすればよいCursorAdapterですか?すでにインターネットで検索しましたが、これを行う方法を理解できませんでした。

コードにいくつかの指示を求めるのではありません。

ありがとう

favolas

mainuコメントに続く更新

MyAdaptクラス:

これは正しい方法ですか?

favolas

0 投票する
2 に答える
2265 参照

android - UIスレッドでカーソルを使用するAndroid

カーソルを使用してUIスレッドのsqliteデータベースからデータを取得するのはいつかどうか疑問に思っています。基本的に私はカーソルローダーを使ってカーソルを取得します。そして、そのカーソルで何かをしたいと思います。メインのUIスレッドからカーソルを使って何かをしても大丈夫ですか?本当に私はカーソルから1行を読み取る必要があります。

0 投票する
2 に答える
6724 参照

android - フラグメント android の CursorLoader 内に進行状況ダイアログを表示する

こんにちは、タイトルが示すように、フラグメント内の CursorLoader からデータをロードするときに進行状況ダイアログを実装する方法を知っている人なら誰でも知っています。この点で例が見つかりません。それを行う方法に関するリンクまたはガイドは高く評価されます。ありがとうございました

0 投票する
1 に答える
9640 参照

android - setNotificationUriのメカニズムは何ですか?

CursorLoaderを実装したばかりで、うまく機能します。実際、テストするまで、基になるデータが変更されたときにListViewが自動的に更新されるとは思っていませんでした。これは明らかにsetNotificationUriの魔法です。

私の質問は、カーソル内のデータがいつ変更されたかをどのようにして知るのかということです。静かにどこかに追加の行を挿入するとします。基盤となるメカニズムは常にデータベースにクエリを実行し、過去のデータと比較しますか?データセットが大きい場合、それはひどく非効率的ではないでしょうか?

カーソルローダーを使用する前は、必要に応じて手動で更新していました。もうこれを行う必要がないのは素晴らしいことですが、CursorLoaderをバックグラウンドでこれに任せるのは効率的ですか?

0 投票する
1 に答える
4161 参照

android - Android CursorLoader および LoaderManager エラー

最小 API 10 で CursorLoader と LoaderManager を実装しようとしています。

ただし、AsyncTaskLoader.class の 63 行目で IllegalArgument Exception が発生し続けます (例外が発生している AsyncTaskLoader.class のソース コードは以下とこのリンクにあります。

以下は、エラー時のスタックです。

コンテンツ プロバイダーをテストし、クエリ メソッドが Sqlite データベースから有効なカーソルを返すことを確認しました。以下は、CursorLoader と LoaderManager を実装しようとしているアクティビティのソース コードです。

ここで私が間違っていることを誰かが見ていますか?

ありがとう。


アプリはそれを作るようです

そして、そこで例外をスローします。

以下はlogcatです: