現在、ローダーを使用してContentProviderからデータを取得しています(カーソルの自動更新を有効にするため)。このアプローチは、データベースのクエリには簡単ですが、他のDB操作(挿入、更新、削除など)には適していないようです。
私の質問は次のとおりです。
UIスレッドでSQLite操作を実行しました。問題は、クエリに長い時間がかかるかどうかということになると思います。 SQLiteデータベースでSQL呼び出しを実行するのに時間がかかりすぎて、アプリケーションがクラッシュしたことはありません。
そうは言っても、ロードに時間がかかる可能性のある複雑なクエリを作成する場合は、それをAsyncTaskまたはThreadとして実行し、必要に応じてコールバックを使用してUIを更新することをお勧めします。
これは、SQLiteに関する素晴らしいチュートリアルですAndroid(これはあなたが話していた複雑なSQLタイミングの問題のいくつかにも対処します): http://www.vogella.com/tutorials /AndroidSQLite/article.html
すべてのSQLite操作はバックグラウンドである必要はありませんが、必要がありますあります。単純な行の更新でさえ、UIスレッドに影響を与える可能性があるため、アプリケーションの応答性に影響を与える可能性があります。
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
}
}
}
};
詳細: