一. 了解 ContentProvider java
1. 什么是ContentProvider android
让开发者在多个应用中操做数据,如存储,修改删除 的惟一方式 ,一个ContentProvider 实现 了下面的接口。
数据库
ContentProvider.insert( Uri ,ContentValues ) ContentProvider.query (Uri ,String [] ,String ,String [], String ) ContentProvider.update(Uri .ConentValues .String ,String []); ContentProvider.delete( Uri ,String .String ); ContentProvider.getType (Uri );
经过 这些接口,咱们不用关心数据 的结构 。ide
2. 什么是URIspa
UUniversal Resources Identifier,在安卓 中,URI有三个部分code
(1) "content://" ,开头xml
(2) 数据路径对象
(3) ID ,可选 ,若是 不写,全部 的数据 。接口
content://contacts/peopel开发
不少经常使用 的URI安卓 已经定义也常量 。
3.ContentResolver
ContentProvider将数据暴露给外面,而后咱们用ContentResolve获得数据 。至关 因而一个数据 的消费者,咱们用 getContentResolver来获得当前 应用的ContentResolver对象 。
与ContentProvider一一对应,它有五个接口。
它们将以Cursor的形式返回结果 ,与数据 库相同。
二. 使用ContentProvider
系统的一些 程序 ,如联系人,通话记录等,每每做为 ContentProvider向外提供 数据 ,咱们能够用managedQuery()方法很方便查询相关数据
1.联系人
三个步骤,咱们在这里将Activity extends ListActivity,重点突出ContentProvider的做用。
(1) 查询联系人,获得Cursor对象
managedQuery( Uri uri ,String [] projection ,String selection ,String [] selectionArgs ,String sortOrder)
projection: 要查询的数据 的属性。
(2)新建 一个Adapter
ListAdapter adapter = new SimpleCursorAdapter ( Context context ,int layout ,Cursor c ,String [] from ,int [] to );
(3) 设置Adapter
setListAdapter (adapter );
例子:
Cursor c = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null); ListAdapter adapter = new SimpleCursorAdapter (getApplicationContext(), android.R.layout.simple_list_item_2, c, new String [] {ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}, new int [] {android.R.id.text1,android.R.id.text2}); setListAdapter (adapter);
在ContactsContract中,咱们能够找到全部Contacts的信息。
最后要注意,读取联系人时,要的权限 。
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
2. 通话记录
和上面的相比 ,要改的是
Uri :CallLog.Calls.CONTENT_URI
还有两个属性: 号码,通话时间
以下:
Cursor c = managedQuery(CallLog.Calls.CONTENT_URI, null,null,null,null); ListAdapter adapter = new SimpleCursorAdapter (getApplicationContext(), android.R.layout.simple_list_item_2, c, new String [] {Calls.NUMBER,Calls.DURATION}, new int [] {android.R.id.text1,android.R.id.text2}); setListAdapter (adapter);
3. 多媒体信息
4. 书签
三 .使用ContentResolver
外部应用须要对ContentProvider中的数据进行添加、删除、修改和查询操做时,可使用ContentResolver 类来完成,要获取ContentResolver 对象,可使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操做数据。
1. 删除 数据
首先,咱们要获得ContentResolver 对象
ContentResolver resolver = getContentResolver();
使用delete
ContentResolver.delete (Uri uri ,String where ,String [] selectionArgs );
如要删除 全部 的联系人:
resolver.delete( Data.CONTENT_URI ,null ,null );
若是要删除 名字为WES的,以下
resolver.delete (Data.CONTENT_URI ,StructuredName.DISPLAY_NAME +"=", new String [] {"WES"});
2. 查询数据
与数据库相似
ContentResolver.query (Uri uri ,String [] projection ,String selection ,String [] SelectionArgs ,String sortOrder );
projection :要查询的属性。
如要查询全部人l,的信息。
resolver.query (ContactsContract.CommenDataKinds.Phone,CONTENT_URI , null ,null,null, null);
3. 更新数据
ContentResolver.update (Uri uri ,ContentValues values ,String where ,String [] selectionArgs );
以下例子:
values.put(StructruedName.DISPLAY_NAME ,"WES" ); resolver.update(Data.CONTENT_URI , values , StruacturedName.DISPLAY_NAME+ "=?", new String [] {"WES"});
4. 插入数据
这个 看起来很容易 ,可是实际 上很难。
ContentResolver .insert( Uri uri ,ContentValues values );
暂时不写