Android利用ContentResolver查詢的三種方式

        今天作到一個小項目,查詢手機中短信的信息,固然得去系統暴露出來的數據庫中去查詢了,後來發現有三種方式能夠選擇,下面一一寫出來。java

         第一種方式,採用 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();

         第二種查詢方式,這種查詢一樣是在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));
		}

        第三種查詢方式,這種方式是利用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。

轉自本人ITEYE:http://keeponmoving.iteye.com/blog/1498282性能優化

相關文章
相關標籤/搜索