ContentProvider:
1、ContentProvider为存储和读取数据提供统一的接口;
2、使用ContentProvider,应用程序可以实现数据共享;
3、android内置的许多数据都是使用ContentProvider形式,供开发者调用(如视频、音频、图片、通讯录等);
URI:Universal Resource Identifier
要操作的数据,Android上可用的每种资源-图像,视频片段、网络地址等都可以用Uri来表示;
e.g:联系人URI 为content://contacts/people
1:需要操作的ContentProvider;2:对ContentProvider中的什么数据进行操作
由以下几个部分组成:
ContentProvider(内容提供者)的scheme已经由Android规定,scheme为:content://
主机名(authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它;contacts
路径(path)可以用来表示我们要操作的数据:/people
使用ContentResolver操作ContentProvider中的数据:
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成(使用getContentResolver()方法获取);
ContentResolver类提供了与ContentProvider类相同签名的四个方法:
public Uri insert(Uri uri,ContentValues values):该方法用于往ContentProvider添加数据。
public int delete(Uri uri,String selection,String[] selectionArgs);该方法用于从ContentProvider删除数据。
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):该方法用于从ContentProvider获取数据。
e.g:
ContentResolver resolver = getContentResolver();//获取ContentResolver
Uri uri = Uri.parse(“content://contacts/people”);//要操作的ContentProvider
ContentValues values = new ContentValues();
values.put(“name”,”sunrise");
values.put(“number”,”18617191218”);
resolver.insert(uri,values);
监听ContentProvider中数据的变化
调用getContentResolver().notifyChange(uri,null)来通知注册在此URL上的访问者。
Listview SimpleAdapter:
/**SimpleAdapter属于Adapter适配器的一种,是数据和listview之间的桥梁
* 第一个参数:Activitiy的上下文
* 第二个参数:生成的一个Map列表选项
* 第三个参数:listview一行的分布样式,可以自己定义,可以使用Android系统本身
* 第四个参数:定义Map中有哪些key
* 第二个参数:生成的一个Map列表选项
* 第三个参数:listview一行的分布样式,可以自己定义,可以使用Android系统本身
* 第四个参数:定义Map中有哪些key
* 第五个参数:用来填充的组件,对应于第四个参数中的key
**/
adapter
=
new
SimpleAdapter(
this
, getData(),
R.layout.
listview
,
new
String[]{
"number"
,
"name"
},
getData():返回一个List<Map<String,String>>的一个列表。
/**定义存储数据的List,并返回给SimpleAdapter**/
List<Map<String,String>> contact =
new
ArrayList<Map<String,String>>();
/**使用ContentResolver操作ContentProvider中的数据**/
ContentResolver resolver = getContentResolver();
/**使用query获取ContentProvider的数据
Android2.0以后联系人就由ContactsContract类替换了People类
**/
Cursor c = resolver.query(ContactsContract.Contacts.
CONTENT_URI
,
null
,
null
,
null
,
null
);
/*获取特定的数据列,并按照联系人姓名排列*/
Cursor c = resolver.query(ContactsContract.Contacts.
CONTENT_URI
,
PHONES_PROJECTION
,
null
,
null
,
"display_name desc"
);
第一个参数:URL,确定要操作的数据(指定所要操作的ContentProvider)
第二个参数:指定列的数据
第三个参数:指定行的数据
第四个参数:
第五个参数:可以定义返回数据的排列
然后使用Cursor来对我们的联系人数据进行处理:
行、列;
e.g:获取联系人姓名
/*首先获取联系人处于该数据库的第几列*/
int
displayNameColumn = c.getColumnIndex(ContactsContract
.Contacts.DISPLAY_NAME);
/*然后获取该列的数据即是要取得的联系人的姓名(行数由c.movoToNext()来交互)*/
String name = c.getString(displayNameColumn)