ContentProvider-----跨应用程序访问数据

android平台中,应用程序中的数据是私有的,其他的应用程序是不能轻易访问的,即不能够跨进程访问数据。ContentProvider使得android平台中数据得到共享,也是跨进程访问数据的方式之一。

一、创建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返回的数据结构,是类似JDBCResultSet,在android中,是Cursor对象。

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

Content:// 

 
1、 创建数据库

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

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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章