ContetProvider:一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据
1、ContentProvider是用表的形式来组织数据
2、ContentProvider提供的方法
query:查询
insert:插入
update:修改
delete:删除
getType:获取到数据类型
onCreate:创建数据时调用的回调函数
3、ContentProvider有一个URI匹配器,这个URI用于表示这个ContentProvider所提供的数据
实现步骤:
1、定义一个类,继承ContentProvider
2、在manifests文件下的AndroidManifest中注册
3、实例化一个UriMatcher
4、创建一个静态(static)块添加uri
5、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
代码实现如下:
项目名:ContentProvider_Dome_one
1、定义一个类,继承ContentProvider
public class MyContentProvider extends ContentProvider {
public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
MySql mySql;
SQLiteDatabase sqLiteDatabase;
static {
/**
*参数一:String authority: 填写注册的authority
*参数二String path: 方法的标记
*参数三 int code: 两方匹配后的返回值 除了-1 因为-1是不匹配
* uri由voi.name/query组成
*/
uriMatcher.addURI("voi.name", "query", 0);
uriMatcher.addURI("voi.name", "insert", 1);
uriMatcher.addURI("voi.name", " delete",2);
uriMatcher.addURI("voi.name", " update",3);
}
@Override
public boolean onCreate() {
mySql = new MySql(getContext());
sqLiteDatabase = mySql.getWritableDatabase();
return false;
}
/**
* @param uri 方法匹配的uri
* @param projection 列名
* @param selection 查询条件
* @param selectionArgs 查询条件的值
* @param sortOrder 排序
* @return
*/
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
if (uriMatcher.match(uri) == 0) {//匹配成功
/**
* String table 表名
* String[] selection 列名
* String selection 查询条件
* String[] selectionArgs 查询条件的值
* String groupBy 分组
* String having 拥有条件
* String orderBy 排序
*/
Cursor cursor = sqLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;//返回数据集
} else {
//失败
return null;
}
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
if (uriMatcher.match(uri) == 1) {
/**insert返回值 当前插入的行数*/
sqLiteDatabase.insert("user", null, values);
Uri uri1=Uri.parse("voi.name/insert");
return uri1;
} else {
return null;
}
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
if(uriMatcher.match(uri)==2){
/**delete返回值 表示被影响(删除)的行数*/
int code= sqLiteDatabase.delete("user",selection,selectionArgs);
return code;
}else{
return -1;
}
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
if(uriMatcher.match(uri)==3){
/**update 表示被影响(修改)的行数*/
int code= sqLiteDatabase.update("user",values,selection,selectionArgs);
return code;
}else{
return -1;
}
}
}
2、在manifests文件下的AndroidManifest中注册
Authorities 名称随便取,但是自己要记住
Name:和Activity一样,是自定义ContentProvider的路径和名字
Exported 是否暴露数据,写true
3、实例化一个UriMatcher
public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
4、创建一个静态(static)块添加uri
static {
/**
*参数一:String authority: 填写注册的authority
*参数二String path: 方法的标记
*参数三 int code: 两方匹配后的返回值 除了-1 因为-1是不匹配
* uri由voi.name/query组成
*/
uriMatcher.addURI("voi.name", "query", 0);
uriMatcher.addURI("voi.name", "insert", 1);
uriMatcher.addURI("voi.name", " delete",2);
uriMatcher.addURI("voi.name", " update",3);
}
5、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
public class MyContentProvider extends ContentProvider {
public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
MySql mySql;
SQLiteDatabase sqLiteDatabase;
static {
/**
*参数一:String authority: 填写注册的authority
*参数二String path: 方法的标记
*参数三 int code: 两方匹配后的返回值 除了-1 因为-1是不匹配
* uri由voi.name/query组成
*/
uriMatcher.addURI("voi.name", "query", 0);
uriMatcher.addURI("voi.name", "insert", 1);
uriMatcher.addURI("voi.name", " delete",2);
uriMatcher.addURI("voi.name", " update",3);
}
@Override
public boolean onCreate() {
mySql = new MySql(getContext());
sqLiteDatabase = mySql.getWritableDatabase();
return false;
}
/**
* @param uri 方法匹配的uri
* @param projection 列名
* @param selection 查询条件
* @param selectionArgs 查询条件的值
* @param sortOrder 排序
* @return
*/
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
if (uriMatcher.match(uri) == 0) {//匹配成功
/**
* String table 表名
* String[] selection 列名
* String selection 查询条件
* String[] selectionArgs 查询条件的值
* String groupBy 分组
* String having 拥有条件
* String orderBy 排序
*/
Cursor cursor = sqLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;//返回数据集
} else {
//失败
return null;
}
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
if (uriMatcher.match(uri) == 1) {
/**insert返回值 当前插入的行数*/
sqLiteDatabase.insert("user", null, values);
Uri uri1=Uri.parse("voi.name/insert");
return uri1;
} else {
return null;
}
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
if(uriMatcher.match(uri)==2){
/**delete返回值 表示被影响(删除)的行数*/
int code= sqLiteDatabase.delete("user",selection,selectionArgs);
return code;
}else{
return -1;
}
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
if(uriMatcher.match(uri)==3){
/**update 表示被影响(修改)的行数*/
int code= sqLiteDatabase.update("user",values,selection,selectionArgs);
return code;
}else{
return -1;
}
}
}
由于在这里的
ContentProvider,我使用了数据库,所以数据库的代码如下:
public class MySql extends SQLiteOpenHelper {
public static String NAME="user";
public static int VERSION=1;
public MySql(Context context) {
super(context, NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(_id integer primary key autoincrement ,name varchar(20),age int)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity中的代码:
这里我在数据库中增加了数据
public class MainActivity extends AppCompatActivity {
SQLiteDatabase sqLiteDatabase;
MySql mysql;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mysql = new MySql(this);
sqLiteDatabase = mysql.getWritableDatabase();
init();
}
private void init() {
ContentValues cv = new ContentValues();
String name = "a";
int age = 20;
cv.put("name", name);
cv.put("age", age);
sqLiteDatabase.insert("user", null, cv);
/**
* String table 表名
* String[] selection 列名
* String selection 查询条件
* String[] selectionArgs 查询条件的值
* String groupBy 分组
* String having 拥有条件
* String orderBy 排序
*/
Cursor cursor = sqLiteDatabase.query("user", null, null, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String names = cursor.getString(0);
int ages=cursor.getInt(1);
Log.i("a",names+""+ages);
}
}
}
}
P:如果另一个程序觉得
上面这个程序数据库的东西非常好,它想拿到上面这个数据库中的东西,怎么办呢??这个时候ContentProvider的作用就发挥出来了
以下程序实现访问ContentProvider_Dome_one
1、新建一个工程,在Activity中获取内容解析者
2、在xml中布局中,设置4个Button,方便测试
3、在Activity中监听对应的Button,实现对应的方法
代码实现如下:
项目名:ContentProvider_Dome_Two
1、新建一个工程,在Activity中获取内容解析者
public class MainActivity extends AppCompatActivity {
ContentResolver contentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**ContentResolver内容解析者
* 1.获取内容解析者*/
contentResolver = getContentResolver();
}
2、在xml中布局中,设置4个Button,方便测试
3、在Activity中监听对应的Button,实现对应的方法
public void query_but(View view){//查询
Uri uri = Uri.parse("content://voi.name/query");
/**
* Uri uri : content://voi.name(填写注册的authority)/query(方法的标记)
* String[] projection 列名
* String[] selection 查询条件
* String[] selectionArgs 查询条件的值
* String sortOrder 排序
*/
Cursor cursor = contentResolver.query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(0);
int age = cursor.getInt(1);
Log.d("MainActivity_dome", name + "我是其他程序" + age);
}
}
}
public void insert_but(View view){//增加
Uri uri=Uri.parse("content://voi.name/insert");
ContentValues values=new ContentValues();
values.put("name","coco");
values.put("age",12);
contentResolver.insert(uri,values);
}
public void delete_but(View view){//删除
Uri uri=Uri.parse("content://voi.name/delete");
contentResolver.delete(uri,"name=?",new String[]{"coco"});
}
public void update_but(View view){//修改
Uri uri=Uri.parse("content://voi.name/update");
ContentValues values=new ContentValues();
values.put("age",2);
contentResolver.update(uri,values,"name=?",new String[]{"coco"});
}