54

私はこれが議論されていることを知っていますが、私は問題の現状について質問したいと思いました。sqliteデータベースに関連してCursorLoaderを使用するにはContentProviderを作成する必要がありますか?

見つけた

ContentProviderなしでのCursorLoaderの使用

Emmbyがコメントしたように、私がまだ望んでいたものとまったく同じように見えます

  • ユーザーは、データの変更を更新するメカニズムがないという1つの制限に注意する必要があります(ローダーが行うことになっているように)

したがって、別の解決策が言及されています

https://github.com/commonsguy/cwac-loaderex

さらに、いくつかの欠点が指摘されています

  • ただし、自動再クエリを使用するには、UIと更新に同じローダーを使用する必要があり、バックグラウンドサービスでの使いやすさが制限されます。

もちろん、LoaderManagerを使用するときは、それが導入されたすべての利点を利用したいと考えています。だから私の質問は、コンテンツプロバイダーを実装する必要なしにsqliteデータベースに関連してLoaderManagerを使用する方法があるかどうかですが、それでもすべての利点があります。

ありがとう

4

3 に答える 3

66

投稿で言及した2つの実装はどちらも、基になるコンテンツが変更されたときに通知を受信する機能をCursorLoader 除いて、すべての利点を提供します。

私は最近これをよく調べていますが、Android APIは現在、rawのみでこれを行う手段を提供していません(下に登録されているすべてのに通知するために使用されるメソッドとメソッドSQLiteDatabaseのみを提供します)特定の通知)。ContentResolver#notifyChange()Cursor#setNotificationUri()CursorUri

そうは言っても、今のあなたの選択肢は次のとおりです。

  1. SQLiteDatabaseコンテンツが変更されたときに通知を受信でき、アプリケーション内の既存のすべての通知にこれらの通知を中継できるオブザーバーを自分で実装しLoaderます。この課題に取り組みたい場合に役立つ可能性のあるを実装する方法について、かなり広範なブログ投稿を書きました。Loaderまたは...

  2. Mark Murphyのライブラリを使用し、彼のライブラリが提供する操作LoaderExを使用してデータベースを変更するだけです。AsyncTask彼のタスクが更新される理由は、挿入/更新/削除が実行された直後にLoader呼び出され、コンテンツが変更され、データを更新する必要があることを効果的に伝えるためです。onContentChangedLoaderLoader

  3. ContentProviderと一緒に使用するだけで、このメソッドをCursorLoader使用して、コンテンツの変更が発生したことContentResolver#notifyChange()を通知できます。CursorLoader

私はより良い解決策を見つけようとしています。私がそれを見つけて実装した場合は、将来報告しますが、今のところ、これらはそうしなければなりません。

于 2012-10-13T02:58:57.323 に答える
2

これが私のonCreateLoaderでの私の解決策です

{
Uri u = Uri.parse("content://what_string_you_want");
return new CursorLoader(this, yourURI, projection, null, null, null) {
    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();

    @Override
    public Cursor loadInBackground() {
        Cursor c = YOUR_DATABASE.doYourQuery(...);
        if (c != null) {
          // Ensure the cursor window is filled
           c.getCount();
           c.registerContentObserver(mObserver);
        }

        c.setNotificationUri(getContext().getContentResolver(), getUri());
        return c;
    }
};
}

DBを変更するコードの後に​​、

 getContentResolver().notifyChange(
            Uri.parse("content://same_with_first_string"), null);
于 2014-12-09T17:25:16.227 に答える
0

共有設定のブール値をfalseとして設定するのはどうですか..そのブール値がtrueのときにコンテンツを更新します....そして、基になるデータベースを変更する操作のいずれかが..そのブール値がtrueに設定され、共有設定としてあなたが関連するメソッドが呼び出された直後に変更をライブで受け取ることができるchangelistener

于 2021-08-25T15:59:14.987 に答える