android
平台中
,
应用程序中的数据是私有的,其他的应用程序是不能轻易访问的,即不能够跨进程访问数据。
ContentProvider
使得
android
平台中数据得到共享,也是跨进程访问数据的方式之一。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一、创建
ContentProvider
类(需要继承
ContentProvider
类,重写里面的方法)

二、获取
ContentProvider
,代码如下:
ContentResolver contentResolver=    getContentResolver();

三、
ContentResolver
实例带的方法可实现找到指定的
Content provider
并获取到
Content provider
的数据。
ContentResolver
的查询过程开始,
Android
系统将确定查询所需的具体
Content provider
,确认它是否启动并运行它。
android
系统负责初始化所有的
Content provider
,不需要用户自己去创建。实际上,
content provider
的用户都不可能直接访问到
content provider
实例,只能通过
ContentResolver
在中间代理。数据模型
Content provider
展示数据类似一个单个数据库表。其中:

l 
每行有个带唯一值的数字字段,名为
_ID
,可用于对表中指定记录的定位;

l 
Content provider
返回的数据结构,是类似
JDBC
ResultSet
,在
android
中,是
Cursor
对象。

l 
URI
每个
content provider
定义一个唯一的公开的
URI
,用于指定到它的数据集。一个
content provider
可以包含多个数据集(可以看作多张表),这样,就需要有多个
URI
与每个数据集对应。这些
URI
要以这样的格式开头:

Content:// 

 
1、
创建数据库

一、
建立数据库类(继承
SQLiteOpenHelper
,重写
onCreate
方法)

二、
建立表工具类
(Table.java)

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

public class Tables {
        public final static Uri table =Uri.parse("content://com.liushu/s");
        public final static String table_uri = "com.liushu";
        public final static String _id="_id";
        public final static String _name="_name";
        public final static String table_name="s";
}
/**
* table:表示该表的Uri路径
* table_uri:表示该表的主机名
* _id:表示该表的主键名
* _name:_name字段
* table_name:表示表的路径
*/
三、
建立
ContentProvider
子类
(
重写
ContentProvider
,主要是
onCreate
方法
)

 

1
、通过
onCreate
方法获取数据库类
MyDatabase

   
public
boolean
onCreate() {

      
database
=
new
MyDatabase(getContext());

      
return
true
;

    }

 

 

 

 

 

 

                  2
、建立
Uri
匹配方法

private
final
static UriMatcher sMATCHER ;
        
static{
             sMATCHER =
new UriMatcher(UriMatcher.NO_MATCH);    
             sMATCHER.addURI(Tables.table_uri,Tables.table_name,1);    
             sMATCHER.addURI(Tables.table_uri,Tables.table_name+
"/#",2);    
        }
    AddURI(String,String,int)
:第一个参数是指主机名,第二参数表示路径名,第三个参数表示匹配后返回的值(通过
match(Uri)
来匹配值)。

               
3
、重写增删改查方法,下面以
insert
方法为例

    
public Uri insert(Uri uri, ContentValues values) {
            
if(sMATCHER.match(uri)==1){
                     db = database.getWritableDatabase();
                     db.insert(Tables.table_name, Tables._id, values);
             }
                    
return
null;
        }
  4
、配置
AndroidManifest.xml

<
provider
android:authorities
="com.liushu"    
android:name
=".MyContentProvider"
>
</
provider
>

             Android:authorities
:定义
provider
的主机名,需要和
Content://host:port/path/id
中的
host:port
一样。
Android:name
:定义
provider
类。

四、
 
建立
Activity

1、 
ContProvider
是不执行方法的,而是使用
ContentResolver
代替他来执行。通过
getContentResolver()
可以获取方法该对象。

2、 
创建一个
ContentValues
对象,将需要插入的字段放入该对象中(
key-value

3、 
contentResolver
对象执行
insert
方法

4、 
代码如下

ContentResolver contentResolver=    getContentResolver();
            ContentValues    values =
new ContentValues();
            values.put(Tables._id, 2);
            values.put(Tables._name,
"liushu");
            contentResolver.insert(Tables.table, values);
/**
*insert(Uri,ContentValues):Uri必须为完整的路径
*/
5、
将该项目
class
文件打包成
jar
文件

 

五、
建立
B
项目

 

1、 
建立该项目,并且将
A
项目中打包成
jar
文件导入到该项目中

2、 
Activity
中写入如下代码:

ContentResolver contentResolver = getContentResolver();
             ContentValues values =
new ContentValues();
             values.put(Tables._id, 4);
             values.put(Tables._name,
"liushu");
             contentResolver.insert(Tables.table, values);
3、 
执行该项目
4、 
打开
CMD
窗口,运行
adb shell
命令进入模拟机
linux
系统中
5、 
linux
系统中输入命令:
sqlite3 data/data/com.content.provider/databases/s.db
com.content.provider
:包名,也就是应用程序中
androidManifest.xml
配置的
package
属性值。
s.db
:表存放的数据库的名称
6、 
输入命令
select  * from s
,查询
s