Android之——ContentResolver查詢的三種方式
阿新 • • 發佈:2017-08-04
popu com 耗時 封裝 target 最適 token res 數據庫
Android開發中性能優化始終要謹記在心。所以假設數據量略微大點都要使用異步查詢。盡量避免在UI線程中做耗時操作,而查詢而言,利用Android提供好的異步查詢框架是最適合的了。事實上AsyncQueryHandler也是封裝了Handler來實現的。另一點,一般在查詢本地的應用的數據的時候要去採用CursorAdapter。
轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/47785491
今天做到一個小項目。查詢手機中短信的信息,當然得去系統暴露出來的數據庫中去查詢了,後來發現有三種方式能夠選擇,以下一一寫出來。
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。
Android之——ContentResolver查詢的三種方式