您的位置:首页 > 移动开发 > Android开发

Android四大组件之内容提供者--ContentProvider

2017-05-09 18:49 501 查看
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(@No
c141
nNull 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中注册
<provider
android:authorities="voi.name"
android:name=".provider.MyContentProvider"
android:exported="true"/>

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,方便测试

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:onClick="insert_but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加"/>
<Button
android:onClick="delete_but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"/>
<Button
android:onClick="update_but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改"/>
<Button
android:onClick="query_but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询"/>
</LinearLayout>
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"});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: