一、创建
新建:新建一个继承自ContentProvider的类
重写:重写6个方法,分别是create(),insert(),delete(),update(),query(),getType()
注册:需要在Manifest中注册provider。这样当外部程序访问本程序数据时,可以精确知道用的是哪个provider
android:authorities="com.example.administrator.sqliteexecsql.provider"
android:name="com.example.administrator.sqliteexecsql.DBProvider"
android:exported="true"/>
name 是继承自ContentProvider的类名
authorities 是自己起的一个名字,作为外部程序使用ContentProvider的识别.格式最好写com.example.provider
exported 设置为true表示允许外部程序使用provider,设为false则外部程序不能使用
调用:ContentResolver resolver = getContentResolver();之后根据设置的uri来具体调用ContentProvider中的方法
URI: content://com.example.provider/person/10
content:// ----->固定写法
com.example.provider即是你在清单文件中注册provider时的authorities
person-------->path
10-------------->pweson id
二、查(从比较难的查开始,其他的增删改则不在话下了)
//查询方法,需要传入uri,可以传入列名,查询条件,Where后面占位符的值,以及排序方式
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db =myHelper.getReadableDatabase();
/* Cursor c = db.query("person",null,null,null,null,null,null); 查询所有,所有列,无条件,无排序方式等。
如果那边在调用Cursor query()方法时,需要有条件,则这边db.query()中需要加上相应的参数
例如,那边要查balance>? orderBy为 “balance DESC”,那么这边就要
Cursor c = db.query("person",null,selection,selectionArgs,null,null,sortOrder);
但是,另一个问题出现了,就是这里写死了查person表,如果数据库里有多个表,如何指定查哪张表呢?
在外部应用在使用本程序的数据时,查哪张表,别人可以在Uri指定path,本程序要做对应处理,如何处理?
分析,外部应用,指定查哪张表的uri:content://com.example.provider/person 后面的person(path)即为表名
我们只要在本程序中可以拿到后面的表名就可以设置逻辑判断,分析结束
解决方法:UriMatcher 对象的addURI("authorities",path,code)方法,给每个表一个数字编码
具体代码如下:
matcher.addURI(authorities,"person",0);
matcher.addURI(authorities,"student",1);
matcher.addURI(authorities,"person/#",2);
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
authorities就写Manifest中配置的。下面两行将person表的编码设为0,student表的编码设为1
设完之后如何判断?matcher.match(uri),可以返回code
判断查哪张表的逻辑已经清晰了(UriMatcher-->matcher.addURI(,,,)-->matcher.match(uri)-->得到code)
现在又另外一个问题,我想查当前表的具体哪一个id,当然可以再外部程序调用时加上where条件
外部程序中Cursor c =resolver.query("person",null,"id=?",new String[]{"10"},null);
但是太麻烦。我想把id=