内容提供者
01_为什么需要内容提供者
为了能够让其他应用程序访问本地应用程序中数据库,使用内容提供者对外开放几个接口,让其他应用程
序调用这些接口。
02_编写内容提供者(重点)
步骤:
1、在工程中添加一个内容提供者的类,继承ContentProvider,重写其中的方法;
2、在配置文件中配置一个provider,指定主机名唯一标示内容提供者(android4.1.2之后的版本中,需要指定exported=true,否则其他应程序没有权限访问该内容提供者);
3、在内容提供者类里面,创建一个uriMather(柜员),然后做岗前培训,添加增删改查的uri;
4、在内容提供者的增删改查的方法判断uri是否匹配正确,再调用数据库的增删改查的方法访问数据库;
03_内容提供者工作的原理(重点)
在其他应用程序中,通过内容提供者的解析器,操作内容提供者。
通过一个uri唯一的匹配内容提供者,在uri中指定了操作的路径(内容提供者已经匹配过的路径),内容提供者接收到这个uri后就可以做相应的操作;
uri url
http://www.baidu.com:80/i.html
content
ftp://
uri组成:schemel,主机名、端口、路径
http://www.baidu.com/i.html
content://com.itheima.dbapp.accountcontentprovider/delete
04_内容提供者的增删改查的实现
代码:
package com.itheima.dbapp;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class AccountContentProvider extends ContentProvider {
private AccountDBHelper helper;
private static String INSERT = "insert";
private static String DELETE = "delete";
private static String UPDATE = "update";
private static String QUERY = "query";
//创建一个银行的柜员
private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//柜员的岗前培训
static{
// content://com.itheima.dbapp.accountcontentprovider/insert
// content://com.itheima.dbapp.accountcontentprovider/delete
mUriMatcher.addURI("com.itheima.dbapp.accountcontentprovider", INSERT, 1);
mUriMatcher.addURI("com.itheima.dbapp.accountcontentprovider", DELETE, 2);**
mUriMatcher.addURI("com.itheima.dbapp.accountcontentprovider", UPDATE, 3);
mUriMatcher.addURI("com.itheima.dbapp.accountcontentprovider", QUERY, 4);
}
/**
* 初始化实例对象
* 通常是创建一个数据库帮助类的对象
*/
@Override
public boolean onCreate(){
helper = new AccountDBHelper(getContext());
return false;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//匹配用户的相应操作,匹配码与柜员培训的匹配吗一致
if(mUriMatcher.match(uri) == 1){
SQLiteDatabase db = helper.getWritableDatabase();
db.insert("account", null, values);
}
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
if(mUriMatcher.match(uri) == 4){
SQLiteDatabase db = helper.getWritableDatabase();
return db.query("account", projection, selection, selectionArgs, null, null, sortOrder);
}else{
return null;
}
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
if(mUriMatcher.match(uri) == 3){
SQLiteDatabase db = helper.getWritableDatabase();
db.update("account", values, selection, selectionArgs);
}
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
if(mUriMatcher.match(uri) == 2){
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("account", selection, selectionArgs);
}
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
}
05_内容提供者的使用场景