在 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; }
< 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 表