最近几天看了下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等类。