创建内容提供器实现跨程序数据共享
主要实现步骤:
1、新建一个MyContentProvider类继承自ContentProvider。
2、MyContentProvider类中5个必须实现的方法的逻辑实现,
3、内容提供器的注册。
打字真是太费劲了,,下面把代码直接粘进来啦。。。。。。
public class MyContentProvider extends ContentProvider {
public static final int TABLE1_DIR = 0;//访问table1表中的所有数据
public static final int TABLE1_ITEM = 1;//访问table1表中的单条数据
public static final int TABLE2_DIR = 2;//访问table2表中的所有数据
public static final int TABLE2_ITEM = 3;//访问table2表中的单条数据
private static UriMatcher uriMatcher;
private MyDataBaseHelper myDataBaseHelper;
//讲台代码块中uriMatcher初始化操作
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.adiqueen.contentprovidertest","table1",TABLE1_DIR);
uriMatcher.addURI("com.example.adiqueen.contentprovidertest","table1/#",TABLE1_ITEM);
uriMatcher.addURI("com.example.adiqueen.contentprovidertest","table2",TABLE2_DIR);
uriMatcher.addURI("com.example.adiqueen.contentprovidertest","table2/#",TABLE2_ITEM);
}
@Override
public boolean onCreate() {
//创建了一个MyDataBaseHelper实例,并返回true 表示内容提供起初始化完成
//这个时候数据库已经完成了创建和升级的操作
myDataBaseHelper = new MyDataBaseHelper(getContext(),"BookStore.db",null,2);
return true;
}
@SuppressLint("Recycle")
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
//查询数据
SQLiteDatabase db = myDataBaseHelper.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)){
case TABLE1_DIR:
//查询table1表中的所有数据
cursor = db.query("table1",strings, s, strings1, null, null, s1);
break;
case TABLE1_ITEM:
//查询table1表中的单条数据
String table1Id = uri.getPathSegments().get(1);
cursor = db.query("table1",strings, "id = ?", new String[]{table1Id}, null, null, s1);
break;
case TABLE2_DIR:
//查询table2表中的所有数据
cursor = db.query("table2",strings, s, strings1, null, null, s1);
break;
case TABLE2_ITEM:
//查询table2表中的单条数据
String table2Id = uri.getPathSegments().get(1);
cursor = db.query("table2",strings, "id = ?", new String[]{table2Id}, null, null, s1);
break;
default:
break;
}
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
SQLiteDatabase db = myDataBaseHelper.getReadableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)){
case TABLE1_DIR:
case TABLE1_ITEM:
long newBookId = db.insert("table1",null,contentValues);
uriReturn = Uri.parse("content://com.example.adiqueen.contentprovidertest.provider/table1/"+newBookId);
break;
case TABLE2_DIR:
case TABLE2_ITEM:
long newBookId1 = db.insert("table2",null,contentValues);
uriReturn = Uri.parse("content://com.example.adiqueen.contentprovidertest.provider/table2/"+newBookId1);
default:
break;
}
return uriReturn;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
SQLiteDatabase db = myDataBaseHelper.getReadableDatabase();
int updateRows = 0;
switch (uriMatcher.match(uri)){
case TABLE1_DIR:
updateRows = db.update("table1",contentValues,s,strings);
break;
case TABLE1_ITEM:
String table1Id = uri.getPathSegments().get(1);
updateRows = db.update("table1",contentValues,"id = ?",new String[]{table1Id});
break;
case TABLE2_DIR:
updateRows = db.update("table2",contentValues,s,strings);
break;
case TABLE2_ITEM:
String table2Id = uri.getPathSegments().get(1);
updateRows = db.update("table2",contentValues,"id = ?",new String[]{table2Id});
break;
default:
break;
}
return updateRows;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
SQLiteDatabase db = myDataBaseHelper.getReadableDatabase();
int deleteRows = 0;
switch (uriMatcher.match(uri)){
case TABLE1_DIR:
deleteRows = db.delete("table1",s,strings);
break;
case TABLE1_ITEM:
String table1Id = uri.getPathSegments().get(1);
deleteRows = db.delete("table1","id = ?",new String[]{table1Id});
break;
case TABLE2_DIR:
deleteRows = db.delete("table2",s,strings);
break;
case TABLE2_ITEM:
String table2Id = uri.getPathSegments().get(1);
deleteRows = db.delete("table2","id = ?",new String[]{table2Id});
break;
default:
break;
}
return deleteRows;
}
/*
* getType()方法是所有的内容提供起都必须实现的一个方法,用于获取Uri对象所对应的MIME类型
* 一个Uri对象所对应的MIME类型主要有3部分组成,Android对这3部分内容做了如下规定
*
* 1、必须以vnd开头
* 2、如果内容URI以路径结尾,则后接android.curser.dir/,如果内容URI以id结尾则后接android.curser.item/
* 3、最后接上vnd.<authority>.<path>
*
* 所以,对于content://com.example.adiqueen.contentprovidertest.provider/table1这个内容Uri所对应的MIME类型为
* vnd.android.curser.dir/vnd.com.example.adiqueen.contentprovidertest.provider/table1
*
* 所以,对于content://com.example.adiqueen.contentprovidertest.provider/table1/1这个内容Uri所对应的MIME类型为
* vnd.android.curser.item/vnd.com.example.adiqueen.contentprovidertest.provider/table1
*
*
* */
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (uriMatcher.match(uri)){
case TABLE1_DIR:
return "vnd.android.curser.dir/vnd.com.example.adiqueen.contentprovidertest.provider/table1";
case TABLE1_ITEM:
return "vnd.android.curser.item/vnd.com.example.adiqueen.contentprovidertest.provider/table1";
case TABLE2_DIR:
return "vnd.android.curser.dir/vnd.com.example.adiqueen.contentprovidertest.provider/table2";
case TABLE2_ITEM:
return "vnd.android.curser.item/vnd.com.example.adiqueen.contentprovidertest.provider/table2";
default:
break;
}
return null;
}
}
MyDataBaseHelper是我们在之前的学习内容中用到的一个类,继承自 SQLiteOpenHelper的类。在此不错过多的解释。不过针对以上内容,有一些细节需要提一下。
可以看到每一个方法都有Uri参数,这个参数正是ContentProvider调用增删改查方法所传递过来的参数。
下面我们对Uri参数进行分析,分析出调用放想要访问的表和数据
回顾一下,一个标准的URI的写法是这样的
content:/ /com.example.adiqueen.contentprovidertest.provider/table1
这就表示调用方期望访问的是com.example.adiqueen.contentprovidertest这个应用的表table1中的数据
除此之外,我们还可以在这个URI的后面增加一个id
content:/ /com.example.adiqueen.contentprovidertest.provider/table1/1
这就表示调用方期望访问的是com.example.adiqueen.contentprovidertest这个应用的表table1中的id为1的数据
内容URI的格式主要就只有以上两种,以路径结尾就表示调用方期望访问该表中的所有数据,以id结尾的表示调用方期望访问该表中对应于id的数据我们可以使用通配符的方式来分别匹配以上两种格式的内容URI:
""表示匹配任意长度的任意字符 下面的写法是匹配任意表的内容
content:/ /com.example.adiqueen.contentprovidertest.provider/
"#"表示匹配任意长度的数字 下面的写法是匹配table1表中任意行的内容
content:/ /com.example.adiqueen.contentprovidertest.provider/table1/#
最后一步是注册, 在manifest中增加<provider>及内容
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.adiqueen.contentprovidertest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:authorities="com.example.adiqueen.contentprovidertest.provider"
android:name=".MyContentProvider"
android:enabled="true"
android:exported="true"
/>
</application>
</manifest>
访问内容提供器、实现增删改查
我们需要新建一个项目AccessProviderTest来访问ContentProviderTest中的内容提供器,实现对其内容的增删改查功能。
public class MainActivity extends AppCompatActivity {
//增删改查按钮
private Button add;
private Button delete;
private Button update;
private Button query;
private String newId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
add = (Button)findViewById(R.id.add);
delete = (Button)findViewById(R.id.delete);
update = (Button)findViewById(R.id.update);
query = (Button)findViewById(R.id.query);
//添加数据
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse("content://com.example.adiqueen.contentprovidertest.provider/table1");
ContentValues values = new ContentValues();
values.put("name","心理学导论");
values.put("price",22.5);
values.put("author","王先生");
values.put("pages",326);
Uri uri1 = getContentResolver().insert(uri,values);
newId = uri1.getPathSegments().get(1);
}
});
//删除数据
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse("content://com.example.adiqueen.contentprovidertest.provider/table1/"+newId);
getContentResolver().delete(uri,null,null);
}
});
//更改数据
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse("content://com.example.adiqueen.contentprovidertest.provider/table1/"+newId);
ContentValues values = new ContentValues();
values.put("name","高等化学");
values.put("price",88.88);
values.put("author","Liu先生");
getContentResolver().update(uri,values,null,null);
}
});
//查询数据
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse("content://com.example.adiqueen.contentprovidertest.provider/table1");
Cursor cursor = getContentResolver().query(uri,null,null,null,null);
if (cursor != null){
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
Log.d("","name="+name+" author="+author+" price="+price+" pages="+pages);
}
cursor.close();
}
}
});
}
}
网友评论