AndroidがContentResolverで検索する3つの方法

1944 ワード

第1の方式は、getContentResolver()を採用する.query()メソッドは、プライマリ・スレッドでデータをクエリーします.このクエリ方式は非同期クエリではなく、UIスレッドで直接データをクエリします.コードは以下の通りです.
		Cursor cursor1 = getContentResolver().query(Sms.CONVESATION_URI, CONVERSATION_PROJECTION,null, null," sms.date desc");
		while (cursor1.moveToNext()) {
			Log.i("cursor1", String.valueOf(cursor1.getInt(0)));
			Log.i("cursor1", cursor1.getString(1));
			Log.i("cursor1", cursor1.getString(2));
		}
		cursor1.close();

第2のクエリー方式は、UIスレッドでデータをクエリーするものであるが、この方式で得られたCursorは手動で閉じる必要はなく、Activityが自動的に閉じるものであり、cursorはactivityによって管理され、コードは以下の通りである.
		Cursor cursor2 = managedQuery(Sms.CONVESATION_URI, CONVERSATION_PROJECTION, null, null, "sms.date desc");
		while (cursor2.moveToNext()) {
			Log.i("cursor2", String.valueOf(cursor2.getInt(0)));
			Log.i("cursor2", cursor2.getString(1));
			Log.i("cursor2", cursor2.getString(2));
		}

第3のクエリ方式は、Androidが提供する非同期クエリフレームワークAsyncQueryHandlerを利用し、/単一クエリが完了するとonQueryComplete(token,cookie,cursor)を呼び出してクエリが完了したことを通知し、cursorに戻る非同期クエリ方式である.コードは次のとおりです.
private void startQuery() {
		Uri uri = Sms.CONVESATION_URI;
		mQueryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, "sms.date desc");
	}
	//         
	private final class QueryHandler extends AsyncQueryHandler {
		public QueryHandler(ContentResolver cr) {
			super(cr);
		}

		@Override
		protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
			super.onQueryComplete(token, cookie, cursor);
			//   mAdapter Cursor
			mAdapter.changeCursor(cursor);
		}
	}

Android開発ではパフォーマンスの最適化は常に心がけているので、データ量が少しでも大きい場合は非同期クエリーを使用し、UIスレッドでの時間のかかる操作をできるだけ避ける必要がありますが、クエリーではAndroidを利用して良い非同期クエリーフレームワークを提供するのが最適ですが、実はAsyncQueryHandlerもHandlerをカプセル化して実現しています.もう一つ、一般的には、ローカルアプリケーションのデータを照会する際にCursorAdapterを使用します.