1. 程式人生 > >Android利用ContentResolver查詢的三種方式

Android利用ContentResolver查詢的三種方式

今天做到一個小專案,查詢手機中簡訊的資訊,當讓得去系統暴露出來的資料庫中去查詢了,後來發現有三種方式可以選擇,下面一一寫出來。

 第一種方式,採用 getContentResolver().query()方法在主執行緒中查詢資料。這種查詢方式是不是非同步查詢的,直接在UI執行緒中查詢資料,程式碼如下:

Java程式碼  收藏程式碼
  1. Cursor cursor1 = getContentResolver().query(Sms.CONVESATION_URI, CONVERSATION_PROJECTION,nullnull," sms.date desc");  
  2. while (cursor1.moveToNext()) {  
  3.     Log.i("cursor1", String.valueOf(cursor1.getInt(0)));  
  4.     Log.i("cursor1", cursor1.getString(1));  
  5.     Log.i("cursor1", cursor1.getString(2));  
  6. }  
  7. cursor1.close();  

 第二種查詢方式,這種查詢同樣是在UI執行緒中查詢資料,不過這種方式得到的Cursor不用手動去關閉,是Activity自動會去關閉的,cursor由activity去管理,程式碼如下:

Java程式碼  收藏程式碼
  1. Cursor cursor2 = managedQuery(Sms.CONVESATION_URI, CONVERSATION_PROJECTION, null
    null"sms.date desc");  
  2. while (cursor2.moveToNext()) {  
  3.     Log.i("cursor2", String.valueOf(cursor2.getInt(0)));  
  4.     Log.i("cursor2", cursor2.getString(1));  
  5.     Log.i("cursor2", cursor2.getString(2));  
  6. }  

第三種查詢方式,這種方式是利用Android提供的非同步查詢框架AsyncQueryHandler,/是一種非同步查詢方式,當單查詢完畢後,會呼叫onQueryComplete(token, cookie, cursor)通知查詢完畢,並且傳回cursor。程式碼如下:

Java程式碼  收藏程式碼
  1. private void startQuery() {  
  2.         Uri uri = Sms.CONVESATION_URI;  
  3.         mQueryHandler.startQuery(0null, uri, CONVERSATION_PROJECTION, nullnull"sms.date desc");  
  4.     }  
  5.     // 寫一個非同步查詢類  
  6.     private final class QueryHandler extends AsyncQueryHandler {  
  7.         public QueryHandler(ContentResolver cr) {  
  8.             super(cr);  
  9.         }  
  10.         @Override  
  11.         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {  
  12.             super.onQueryComplete(token, cookie, cursor);  
  13.             // 更新mAdapter的Cursor  
  14.             mAdapter.changeCursor(cursor);  
  15.         }  
  16.     }  

 Android開發中效能優化始終要謹記在心,所以如果資料量稍微大點都要使用非同步查詢,儘量避免在UI執行緒中做耗時操作,而查詢而言,利用Android提供好的非同步查詢框架是最適合的了,其實AsyncQueryHandler也是封裝了Handler來實現的,還有一點,一般在查詢本地的應用的資料的時候要去採用CursorAdapter。