問題タブ [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.
android - CursorLoader で所有者のメール アドレスを取得する
ArrayList に所有者の電子メールを入力しようとしています。私はこれを断片的にやっています。これが私のコードです:
私は基本的にここで与えられた例を使用しました。それをフラグメントに適応させただけです。
フラグメントがランチされると、アプリがクラッシュし、次のエラーが発生します。
(私のデバイスには 1 つの Gmail アカウントがあります)
android - アセットからのデータベースを使用した CursorAdapter
事前に作成したアプリケーションでデータベースを使用し、カーソルローダーを使用してデータベースからデータを表示したいと考えています。最初に、このチュートリアル [http://goo.gl/1XS84] に従ってアセット フォルダーからデータベースをコピーしてから、CursorAdapter で CursorLoader を使用します。
ただし、CursorLoader にはデータベースのクエリ URI が必要ですが、どの URI を指定すればよいかわかりません。何か助けはありますか?
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()
Cursor
View
編集1
これを少し掘り下げた後、ここでの根本的な問題は、CursorAdapter
が基になる を処理する方法だと思いますCursor
。私はそれがどのように機能するかを理解しようとしています。
理解を深めるために、次のシナリオを取り上げます。
- がロード
CursorLoader
を終了しCursor
、現在 5 行の を返しているとします。 Adapter
は、これらの行の表示を開始します。を次の位置に移動しCursor
て呼び出すgetView()
- この時点で、リスト ビューがレンダリング中であっても、行 (_id = 2 など) がデータベースから削除されます。
- これが問題です-が削除された行に対応する位置に
CursorAdapter
移動しました。Cursor
メソッドはbindView()
引き続き this を使用してこの行の列にアクセスしようとしますがCursor
、これは無効であり、例外が発生します。
質問:
- この理解は正しいでしょうか?上記のポイント 4 に特に興味があります。ここでは、行が削除されたときに、
Cursor
要求しない限り更新されないという仮定を立てています。 - これが正しいと仮定すると、進行中
CursorAdapter
のイベントのレンダリングを破棄/中止し、代わりに新鮮な( andを介して返される) を使用するように依頼するにはどうすればよいですか?ListView
Cursor
Loader#onContentChanged()
Adapter#notifyDatasetChanged()
PSモデレーターへの質問: この編集は別の質問に移動する必要がありますか?
編集2
さまざまな回答からの提案に基づいて、 s がどのように機能するかについての私の理解に根本的な誤りがあったようLoader
です。次のことがわかります。
Fragment
またはAdapter
を直接操作するべきではありませんLoader
。- はデータのすべての
Loader
変更を監視し、データが変更されるたびAdapter
に新しいものを提供する必要があります。Cursor
onLoadFinished()
この理解を武器に、次の変更を試みました。- 一切の操作はありLoader
ません。現在、refresh メソッドは何もしません。
Loader
また、と の内部で何が起こっているかをデバッグするためContentObserver
に、次のように思いつきました。
Fragment
そして、ここに私のとのスニペットがありますLoaderCallback
これで、DB に変更 (行の追加/削除) があるたびに、のonChange()
メソッドをContentObserver
呼び出す必要があります - 正しいですか? 私はこれが起こっているのを見ません。私ListView
の変化は決して見られません。変更が見られるのは、 を明示的に呼び出しonContentChanged()
た場合だけLoader
です。
ここで何がうまくいかないのですか?
編集3
Loader
わかりましたので、から直接拡張するように書き直しましたAsyncTaskLoader
。DB の変更が更新されていることも、DB に行を挿入/削除するときに呼び出されるonContentChanged()
メソッドも表示されません:-(Loader
いくつかのことを明確にするために:
のコードを使用し
CursorLoader
、Cursor
. ここで、 への呼び出しをContentProvider
自分のDbManager
コードに置き換えました (次に、 を使用DatabaseHelper
してクエリを実行し、 を返しますCursor
)。Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();
データベースでの挿入/更新/削除は、
Loader
. ほとんどの場合、DB 操作はバックグラウンドService
で行われ、いくつかのケースではActivity
.DbManager
クラスを直接使用してこれらの操作を実行します。
私がまだ得ていないのは、行が追加/削除/変更されたことを誰が教えてくれるのですか? Loader
言い換えれば、どこでForceLoadContentObserver#onChange()
呼ばれますか?ローダーで、オブザーバーを次の場所に登録しますCursor
。
Cursor
これは、変更されたときに通知する責任があることを意味しmObserver
ます。しかし、私の知る限り、「カーソル」は、DBでデータが変更されたときに、それが指しているデータを更新する「ライブ」オブジェクトではありません。
これが私のローダーの最新の反復です。
android - 検索可能なアクティビティでのCursorLoaderの使用
アクションバーで使用する検索可能なアクティビティを作成しようとしています。ContentProviderからのデータを提供するCursorAdapterがあります。
私が理解するのに苦労しているのは、APIの例、つまりsearchableDictonaryが、CursorLoadersと非同期で何かを実行する代わりに、managedQueryを実行する理由です。
おそらく私は何かが欠けていますか?
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)も試しましたが、新しいローダーが作成されていますが、同じ結果が得られます。 。メッセージングアクティビティを開く前に両方の方向でテストしましたが、どちらも正常に機能します。メッセージングアクティビティが表示されているときに回転すると問題になります。また、縦向きでメッセージングアクティビティにアクセスし、メッセージングアクティビティを破棄せずに別のアクティビティに移動するメッセージをクリックし、横向きに変更してからメッセージングアクティビティに戻ると、すべてが正常に表示されます。
ローテーション後にメッセージが表示されない理由を理解できませんでした。私はどんなアイデアや助けにもとても素晴らしいと思います。以下に私のメッセージ活動を含めました。
android - AndroidSimpleCursorAdapterからCursorAdapterへ
SimpleCursorAdapter
データベースへのクエリを管理し、結果をで表示するために使用していますListView
。
これが私のコードです:
一見、期待通りに動作しているように見えますが、あるのでこれが進むべき道ではないと思いますCursorAdapter
。
これは初心者の質問であることは知っていますが、Androidでプログラミングを始めたばかりなので、まだよくわかりません。
SimpleCursorAdapter
これを使用からに渡すにはどうすればよいCursorAdapter
ですか?すでにインターネットで検索しましたが、これを行う方法を理解できませんでした。
コードにいくつかの指示を求めるのではありません。
ありがとう
favolas
mainuコメントに続く更新
MyAdaptクラス:
これは正しい方法ですか?
favolas
android - UIスレッドでカーソルを使用するAndroid
カーソルを使用してUIスレッドのsqliteデータベースからデータを取得するのはいつかどうか疑問に思っています。基本的に私はカーソルローダーを使ってカーソルを取得します。そして、そのカーソルで何かをしたいと思います。メインのUIスレッドからカーソルを使って何かをしても大丈夫ですか?本当に私はカーソルから1行を読み取る必要があります。
android - フラグメント android の CursorLoader 内に進行状況ダイアログを表示する
こんにちは、タイトルが示すように、フラグメント内の CursorLoader からデータをロードするときに進行状況ダイアログを実装する方法を知っている人なら誰でも知っています。この点で例が見つかりません。それを行う方法に関するリンクまたはガイドは高く評価されます。ありがとうございました
android - setNotificationUriのメカニズムは何ですか?
CursorLoaderを実装したばかりで、うまく機能します。実際、テストするまで、基になるデータが変更されたときにListViewが自動的に更新されるとは思っていませんでした。これは明らかにsetNotificationUriの魔法です。
私の質問は、カーソル内のデータがいつ変更されたかをどのようにして知るのかということです。静かにどこかに追加の行を挿入するとします。基盤となるメカニズムは常にデータベースにクエリを実行し、過去のデータと比較しますか?データセットが大きい場合、それはひどく非効率的ではないでしょうか?
カーソルローダーを使用する前は、必要に応じて手動で更新していました。もうこれを行う必要がないのは素晴らしいことですが、CursorLoaderをバックグラウンドでこれに任せるのは効率的ですか?
android - Android CursorLoader および LoaderManager エラー
最小 API 10 で CursorLoader と LoaderManager を実装しようとしています。
ただし、AsyncTaskLoader.class の 63 行目で IllegalArgument Exception が発生し続けます (例外が発生している AsyncTaskLoader.class のソース コードは以下とこのリンクにあります。
以下は、エラー時のスタックです。
コンテンツ プロバイダーをテストし、クエリ メソッドが Sqlite データベースから有効なカーソルを返すことを確認しました。以下は、CursorLoader と LoaderManager を実装しようとしているアクティビティのソース コードです。
ここで私が間違っていることを誰かが見ていますか?
ありがとう。
アプリはそれを作るようです
そして、そこで例外をスローします。
以下はlogcatです: