转载自:https://blog.csdn.net/qq_32890771/article/details/71244679
https://blog.csdn.net/qq_27280457/article/details/51819299
https://blog.csdn.net/u012858833/article/details/51629245
内容提供者
什么是内容提供者
在安卓系统中,各应用之间的数据信息是无法直接传递共享的,因此,系统提供了一个组件,用来把系统私有的数据库暴漏给其他应用使用,这就是内容提供者
内容提供者有什么用
内容提供者可以将私有的数据库暴漏给其他应用使用,这样不仅方便了资源共享,另一方面也保证了私有数据库的安全
内容提供者怎么用
①创建内容提供者 (写一个类继承contentprovider 清单文件声明 实现gettype insert update delete query oncreate 五个方法
<provider android:name=".DBContentProvider" android:exported="true"
android:enabled="true" android:authorities="com.richard.appmarket.provider" //
android:permission="com.richard.appmarket.sqlite"
/>
在<application>同级声明权限
<!--声明其他app访问是需要注册的权限--> <permission android:name="com.richard.appmarket.sqlite" android:label="content provider read" android:protectionLevel="normal"></permission>
- 1
- 2
- 3
- 4
- 5
android:authorities 通过这个字符串匹配唯一的内容提供者 尽量使用公司域名的倒写开头 避免跟其他应用冲突exported一定设置为true
② onCreate中创建一个openHelper对象 通过这个openHelper帮助打开数据库,代码如下suo
/**
* Created by Administrator on 2017/11/2.15:05
*/
public class DBContentProvider extends ContentProvider {
private static final int QUERY_MATCHED = 1;
private static final int INSERT_MATCHED = 2;
private static final int UPDATE_MATCHED = 3;
private static final int DELETE_MATCHED = 4;
static {
//给匹配器添加 匹配规则(添加新的uri路径)
sURIMatcher.addURI("com.itheima.mydataprovider", "query", QUERY_MATCHED);
sURIMatcher.addURI("com.itheima.mydataprovider", "insert", INSERT_MATCHED);
sURIMatcher.addURI("com.itheima.mydataprovider", "update", UPDATE_MATCHED);
sURIMatcher.addURI("com.itheima.mydataprovider", "delete", DELETE_MATCHED);
// content://authorities/子路径
//content://com.itheima.mydataprovider/query
}
@Override
public boolean onCreate() {
// 当内容提供者创建的时候 会走这个方法
//在这里可以创建openHelper但是不要打开数据库
openHelper = new MyOpenHelper(getContext());
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
@Nullable String[] selectionArgs, @Nullable String sortOrder) {
int result = sURIMatcher.match(uri);
if(result == QUERY_MATCHED){
SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}else{
throw new IllegalArgumentException("口令错误");
}
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
//先匹配传入的uri
int result = sURIMatcher.match(uri);
if(result==INSERT_MATCHED){
//如果匹配的结果是 insert的话 执行insert的操作 返回结果
SQLiteDatabase db = openHelper.getReadableDatabase();
long info = db.insert("info", null, values);
db.close();
//当插入一条数据的时候 数据库的内容发生了变化 可以通过内容解析者发出一个通知
ContentResolver resolver = getContext().getContentResolver();
//第一个参数 uri 通过这个uri来确定 我要通知那些内容观察者
//第二个参数 如果传入了一个内容观察者 只有这个内容观察者能够收到消息 可以传null 如果是null
//只要注册了相同的uri就可以收到数据变化的消息
resolver.notifyChange(uri,null);
return Uri.parse(String.valueOf(info));
}else{
//结果没有匹配 返回null;
return null;
}
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
int match = sURIMatcher.match(uri);
if(DELETE_MATCHED == match){
SQLiteDatabase db = openHelper.getReadableDatabase();
int result = db.delete(“info”, selection, selectionArgs);
db.close();
return result;
}else{
return -1;
}
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
if(UPDATE_MATCHED == sURIMatcher.match(uri)){
SQLiteDatabase db = openHelper.getReadableDatabase();
int result = db.update("info", values, selection, selectionArgs);
db.close();
return result;
}else{
return -1;
}
}
}
内容使用者:
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.richard.appmarket.db");//provider中android:authorities="com.booyue.appmarket.db"的权限
if (resolver == null || uri == null) {
LoggerUtils.d(TAG + "contentResolver = " + resolver + ",uri = " + uri);
return;
}
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor == null) {
LoggerUtils.d(TAG + "cursor = " + cursor);
return;
}
getAllPackages(cursor);//获取数据集
同时在AndroidManifest.xml中添加provider中声明的权限:
<uses-permission android:name="com.richard.appmarket.sqlite"></uses-permission>//对应provider中