2

この質問は、Content Resolver vs Cursor Loader の質問からのフォローアップです。回答には、 Content Resolver を使用して sqlite Db にレコードを挿入する方法が明確に記載されています。私の質問は次のとおりです。

  1. この機能を実装するためにローダー (通常のローダー) を使用できますか?

例:

    public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
            switch (id) {

    case AppConstants.LOADER_ADD_FAV_PHONE_NUM:

        ContentValues values = new ContentValues();
        values.put(DBHelper.TM_DB_COLUMN_PHONE_NUMBER,
                directionOrder);
        values.put(TransitMeDBHelper.TM_DB_COLUMN_NAME_ID, selectionArgs[0]);
        Uri insertFavStop =getContentResolver().insert(TransitMeContentProvider.CONTENT_URI_INSERT_FAV_PHONE,
                        values);
        break;
    }

return null;
}

これにより、メイン UI スレッドまたはワーカー Thread で機能が実行されますか。コンテンツ リゾルバは data を含むカーソルの代わりに URI を返すため、これに対するコールバックを受信しないことを理解しています。

このコードを実行してみましたが、動作がおかしいです..重複した挿入が記録され、一貫性がありません.ローダーを使用して挿入操作を行う適切なリソースを誰かに教えてもらえますか(クエリの例で多くの例を見てきましたが、動作します魔法のように :) )

ありがとうございました。

4

1 に答える 1

5

この機能を実装するためにローダー (通常のローダー) を使用できますか?

CursorLoaderデフォルトを使用してデータを挿入することはできません。独自に実装する場合Loaderは、おそらくメソッドを使用loadInBackgroundして挿入を行うことができますが、それではコードがぎこちなくなります (実際に機能するかどうかはわかりません)。

これにより、メイン UI スレッドまたはワーカー Thread で機能が実行されますか。コンテンツ リゾルバは data を含むカーソルの代わりに URI を返すため、これに対するコールバックを受信しないことを理解しています。

ローダー コールバックは、それらが実装されているスレッド (UI メイン スレッドである可能性が最も高い) で実行されるためgetContentResolver().insert()、メイン UI スレッドをブロックする可能性があるメイン UI スレッドで実行しています。

私はこのコードを実行しようとしましたが、それは一種の奇妙な動作をします..重複した挿入が記録され、一貫性がありません。

メソッドが何回onCreateLoader呼び出されるかをテストしましたか?

ローダーを使用して挿入操作を行う適切なリソースを誰かに教えてもらえますか(クエリの例を含む多くの例を見てきましたが、それは魅力のように機能します:))

/DatabaseLoaderにデータを挿入するために a を使用しない/使用しようとしないでください。ContentProviderローダーはデータ ソースからデータをロードする (データを挿入しない) ように設計されているため、クエリの魅力のように機能します。データを挿入したい場合は、通常のスレッドAsyncTask( も参照) を使用します。AsyncQueryhandler

于 2012-11-26T20:13:20.720 に答える