web-dev-qa-db-ja.com

Android SQLiteクエリ、挿入、更新、削除、常にバックグラウンドスレッドである必要がありますか?

現在、ローダーを使用してContentProviderからデータを取得しています(カーソルの自動更新を有効にするため)。このアプローチは、データベースのクエリには簡単ですが、他のDB操作(挿入、更新、削除など)には適していないようです。

私の質問は次のとおりです。

  1. すべてのSQLite操作はバックグラウンドスレッドで行う必要がありますか、それともUIスレッドで単一行の挿入、更新、削除などの単純な操作を実行しても安全ですか?
  2. すべてのクエリがバックグラウンドスレッドを通過することを保証するための優れた設計パターンとは何ですか? AsyncTaskを実装したいのですが、AsyncTaskを拡張し、各SQLite操作を実行するスーパータスクを作成する必要がありますか? (ボーナス:必要最低限​​の例を提供できますか?)
15
AutoM8R

UIスレッドでSQLite操作を実行しました。問題は、クエリに長い時間がかかるかどうかということになると思います。 SQLiteデータベースでSQL呼び出しを実行するのに時間がかかりすぎて、アプリケーションがクラッシュしたことはありません。

そうは言っても、ロードに時間がかかる可能性のある複雑なクエリを作成する場合は、それをAsyncTaskまたはThreadとして実行し、必要に応じてコールバックを使用してUIを更新することをお勧めします。

これは、SQLiteに関する素晴らしいチュートリアルですAndroid(これはあなたが話していた複雑なSQLタイミングの問題のいくつかにも対処します): http://www.vogella.com/tutorials /AndroidSQLite/article.html

5
user695992
  1. すべてのSQLite操作はバックグラウンドである必要はありませんが、必要がありますあります。単純な行の更新でさえ、UIスレッドに影響を与える可能性があるため、アプリケーションの応答性に影響を与える可能性があります。

  2. Androidには AsyncQueryHandler 抽象クラスが含まれています:

    非同期ContentResolverクエリの処理を容易にするためのヘルパークラス。

AndroidでAsyncQueryHandlerを使用してコンテンツプロバイダーに非同期的にアクセスする からの2つの実装例を次に示します。メンバークラス:

class MyQueryHandler extends AsyncQueryHandler {

    public MyQueryHandler(ContentResolver cr) {
        super(cr);
    }

    @Override
    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
        // query() completed
    }

    @Override
    protected void onInsertComplete(int token, Object cookie, Uri uri) {
        // insert() completed
    }

    @Override
    protected void onUpdateComplete(int token, Object cookie, int result) {
        // update() completed
    }

    @Override
    protected void onDeleteComplete(int token, Object cookie, int result) {
        // delete() completed
    }
}

匿名クラス:

AsyncQueryHandler queryHandler = new AsyncQueryHandler(getContentResolver()) {
    @Override
    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {

        if (cursor == null) {
            // Some providers return null if an error occurs whereas others throw an exception
        }
        else if (cursor.getCount() < 1) {
            // No matches found
        }
        else {

            while (cursor.moveToNext()) {
                // Use cursor
            }

        }
    }
};

詳細:

  1. AsyncQueryHandlerの実装

  2. http://www.trustydroid.com/blog/2014/10/07/using-asyncqueryhandler-with-content-provider/

4
13rac1