最近几天看了下android.provider包.这个包下的类都是一些获取sqliet3中存储的信息的provider.主要有获取联系人信息的(android.provider.ContactsContract)获取通话记录(android.provider.CallLog),获取设置信息(android.provider.Settings),获取存储的media信息(android.provider.MediaStore)(我主要就看了这四个类,当然还有其它的),信息的获取是通过构造游标(cursor)实现的.我感觉游标的构造就是通过一些方法来构造sql语句.
下面是我写CallLog的简单demo的代码片段:
Uri uri = Calls.CONTENT_URI;
String[] projections = new String[]{
Calls._ID,
Calls.NUMBER,
Calls.TYPE
};
String selections = null;
String[] selectionsArgs = null;
String sortOrder = null;
Cursor cursor = this.managedQuery(uri, projections, selections, selectionsArgs, sortOrder);
int count = -1;
if(cursor != null){
count = cursor.getCount();
}
if(count > 0){
for(int i = 0;i<count ;i++){
cursor.moveToNext();
String s0 = cursor.getString(0);
String s1 = cursor.getString(1);
String s2 = cursor.getString(2);
}
}
Uri是要查询的table的url,projection是要查询的字段,selections相当于where条件部分,selectionArgs是where条件的值,最后sortOrder是order by 部分.下面是条日志中截取的sql语句(这条语句是在写ContactsContract练习时专门定义错误的方法后打出来的日志,正确整不出来,嘿嘿,不知道有没有别的设置)
SELECT _id,
display_name,
data1,
data3,
mimetype,
contacts_status_updates.status_label AS contact_status_label
FROM view_data_restricted data
LEFT OUTER JOIN status_updates contacts_status_updates ON (status_update_id =
contacts_status_updates.status_update_data_id)
WHERE (1)
AND (vnd.android.cursor.dir / data = 'vnd.android.cursor.item/im')
在获取ContactsContract信息时,可以通过ContactsContract.Data的CONTENT_URI查询可以查到通讯中的所有信息,也可以通过一些专有的Uri进行获取专门的信息如Phone,Email等(但是我感觉完全没必要,有Data的Uri完全足够,经过selections过滤掉就可以了);在获取Media信息时有EXTERNAL_CONTENT_URI,INTERNAL_CONTENT_URI之分;Setting信息主要包含了安全(secure)和系统(system)设置,都有相应的CONTENT_URI,具体的在用的时候查看下api就明白了。当然在这个包下还有android.provider.LiveFolders,android.provider.UserDictionary等类。