Content Provider概述
在Google官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是这些存储都只是在单独的一个应用程序之中达到一个数据的共享,当需要操作其他应用程序的一些数据,例如需要操作系统里的媒体库、通讯录等,这时就可能通过Content Provider来满足需求。
Content Provider管理android以结构化方式存放的数据。以相对安全的方式封装数据并且提供简易的处理机制。Content Provider提供不同进程间数据交互的标准化接口。
当你准备取出Content Provider中的数据时,你需要获得一个和当前上下文相关的ContentResolver对象作为客户端。这个对象和一个继承至Content Provider的provider对象相关联。provider从客户端接收请求并且返回结果。
如果你不准备和其他应用共享你的数据,你不需要自定义provider。但是,你需要实现provider以满足个性化搜索数据的需求。同时,当你拷贝和粘贴复杂数据或者文件到他人应用中时,也需要provider。
Content Provider 数据模型
Content Provider使用基于数据库模型的简单表格来提供其中的数据,这里每行代表一条记录,每列代表特定类型和含义的数据。例如,联系人的信息可能以如下所示的方式提供。
每条记录包含一个数值型的ID字段。用于在表格中唯一标识该记录。ID能用于匹配相关表格中的记录。就像关系数据库一样,以二维表格的形式来提供数据的,其中的每一行代表一条记录,每一列代表一种特定类型的数据信息。
Cursor
Content Provider查询后返回的数据是用android.database.Cursor来进行数据的随机读写操作。Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必须知道每一列的名称。必须知道每一列的数据类型。Cursor 是一个随机的数据源。所有的数据都是通过下标取得。
关于 Cursor 的重要方法:
方法名 | 解释 |
---|---|
close() | 关闭游标,释放资源 |
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) | 在缓冲区中检索请求的列的文本,将将其存储 |
getColumnCount() | 返回所有列的总数 |
getColumnIndex(String columnName) | 返回指定列的名称,如果不存在返回-1 |
getColumnIndexOrThrow(String columnName) | 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。 |
getColumnName(int columnIndex) | 从给定的索引返回列名 |
getColumnNames() | 返回一个字符串数组的列名 |
getCount() | 返回Cursor 中的行数 |
moveToFirst() | 移动光标到第一行 |
moveToLast() | 移动光标到最后一行 |
moveToNext() | 移动光标到下一行 |
moveToPosition(int position) | 移动光标到一个绝对的位置 |
moveToPrevious() | 移动光标到上一行 |
判断Cursor是否为空:
if (cur.moveToFirst() == false){ //为空的Cursor
return;
}
访问 Cursor 的下标获得其中的数据:
int nameColumnIndex = cur.getColumnIndex(People.NAME);
String name = cur.getString(nameColumnIndex);
循环 Cursor 取出我们需要的数据:
while(cur.moveToNext()) {
//光标移动成功
String email = cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL));
startManagingCursor(cursor); //查找后关闭游标
//把数据取出
}
当cur.moveToNext() 为假时将跳出循环,即 Cursor 数据循环完毕。
URI
在Android系统中,如果通过ContentReslover来访问数据,也要提供一个URI(Uniform Resource Indentifier,统一资源标志)。ContentReslover类的每个方法都有一个URI类型的参数。ContentReslover的每个方法都需要URI参数来定位资源。而Content Provider提供的每一张数据表格都定义一个URI常量,因此Android就知道如何将ContentReslover的请求与Content Provider绑定起来,这样一条完整的数据通道就建立完成了。
A部分是”content://”。可以看作是网址中的”http://”。
B部分是主机名或authority(主机名/域名),用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如”blog.youkuaiyun.com”。
C部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。
参考
版权申明:本文参考内容版权归原作者所有,感谢原作者的共享。
http://www.2cto.com/kf/201404/296974.html
http://www.android-doc.com/guide/topics/providers/content-providers.html
http://blog.youkuaiyun.com/zuolongsnail/article/details/6566317
http://wy.pipaw.com/xinqing/news12182.html