简介
使用ContentProvider可以方便地实现向第三方应用提供本应用数据的增删改查功能。详见官网介绍:
https://developer.android.google.cn/guide/topics/providers/content-providers
代码实现
服务端应用实现
新建一个类,实现ContentProvider的增删改查接口,并定义ContentProvider使用的url:
package com.test.contentproviderserver;
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;
import android.util.Log;
public class dataProvider extends ContentProvider
{
private SQLiteDatabase db;
//若不匹配采用UriMatcher.NO_MATCH(-1)返回
private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
//匹配码
private static final int CODE_NAME = 1;
private static final int CODE_INFO = 2;
//定义url与匹配码的对应关系
static
{
MATCHER.addURI("com.test.dataProvider", "name", CODE_NAME);
MATCHER.addURI("com.test.dataProvider", "info", CODE_INFO);
}
@Override
public boolean onCreate()
{
DBHelper helper = new DBHelper(getContext());
//创建数据库
db = helper.getWritableDatabase();
return true;
}
/**
* 外部应用向本应用插入数据
*/
@Override
public Uri insert(Uri uri, ContentValues values)
{
switch (MATCHER.match(uri))
{
case CODE_NAME:
Log.d("dataProvider", "insert name");
try {
db.insert("name_table", null, values);
} catch(Exception e) {
Log.d("dataProvider","insert Exception:" + e);
}
break;
case CODE_INFO:
Log.d("dataProvider","insert info");
try {
db.insert("info_table", null, values);
} catch(Exception e) {
Log.d("dataProvider","insert Exception:" + e);
}
break;
default:
break;
}
return null;
}
/**
* 外部应用向本应用删除数据
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs)
{
switch (MATCHER.match(uri))
{
case CODE_NAME:
Log.d("dataProvider", "delete name");
try {
db.delete("name_table", selection, selectionArgs);
} catch(Exception e) {
Log.d("dataProvider","delete Exception:" + e);
}
break;
case CODE_INFO:
Log.d("dataProvider","delete info");
try {
db.delete("info_table", selection, selectionArgs);
} catch(Exception e) {
Log.d("dataProvider","delete Exception:" + e);
}
break;
default:
break;
}
return 0;
}
/**
* 外部应用向本应用更新数据
*/
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
switch (MATCHER.match(uri))
{
case CODE_NAME:
Log.d("dataProvider", "update name");
try {
db.update("name_table", values, selection, selectionArgs);
} catch(Exception e) {
Log.d("dataProvider","update Exception:" + e);
}
break;
case CODE_INFO:
Log.d("dataProvider","update info");
try {
db.update("info_table", values, selection, selectionArgs);
} catch(Exception e) {
Log.d("dataProvider","update Exception:" + e);
}
break;
default:
break;
}
return 0;
}
/**
* 返回对应的内容类型
*/
@Override
public String getType(Uri uri)
{
return null;
}
/**
* 外部应用向本应用查询数据
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
Cursor cursor = null;
switch (MATCHER.match(uri))
{
case CODE_NAME:
Log.d("dataProvider","query name");
try {
cursor = db.query("name_table", projection, selection, selectionArgs,
null, null, sortOrder);
} catch (Exception e) {
Log.d("dataProvider","query Exception:" + e);
}
return cursor;
case CODE_INFO:
Log.d("dataProvider","query info");
try {
cursor = db.query("info_table", projection, selection, selectionArgs,
null, null, sortOrder);
} catch (Exception e) {
Log.d("dataProvider","query Exception:" + e);
}
return cursor;
default:
break;
}
return null;
}
}
新建一个类,用于创建用到的数据库和数据表:
package com.test.contentproviderserver;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "data.db";
private static final int DB_VERSION = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists name_table("
+ "id integer primary key,"
+ "name varchar)");
db.execSQL("create table if not exists info_table("
+ "id integer primary key,"
+ "info varchar)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在AndroidManifest.xml中声明实现的ContentProvider:
<provider android:name=".dataProvider"
android:authorities="com.test.dataProvider"
android:exported="true" />
客户端应用实现
客户端通过url调用服务端的增删改查接口,实现操作服务端的数据:
package com.test.contentproviderclient;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static String nameTableUrl = "content://com.test.dataProvider/name";
private static String infoTableUrl = "content://com.test.dataProvider/info";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
insertData();
queryData();
deleteData();
queryData();
updateData();
queryData();
}
//插入数据
private void insertData() {
try {
Log.d("client", "insertData insert name");
ContentValues nameValues = new ContentValues();
nameValues.put("name", "小明");
getContentResolver().insert(Uri.parse(nameTableUrl), nameValues);
ContentValues nameValues2 = new ContentValues();
nameValues2.put("name", "小暗");
getContentResolver().insert(Uri.parse(nameTableUrl), nameValues2);
ContentValues nameValues3 = new ContentValues();
nameValues3.put("name", "小红");
getContentResolver().insert(Uri.parse(nameTableUrl), nameValues3);
} catch (Exception e) {
Log.d("client", "insertData e1:" + e);
}
try {
Log.d("client", "insertData insert info");
ContentValues infoValues = new ContentValues();
infoValues.put("info", "12345");
getContentResolver().insert(Uri.parse(infoTableUrl), infoValues);
ContentValues infoValues2 = new ContentValues();
infoValues2.put("info", "54321");
getContentResolver().insert(Uri.parse(infoTableUrl), infoValues2);
ContentValues infoValues3 = new ContentValues();
infoValues3.put("info", "00000");
getContentResolver().insert(Uri.parse(infoTableUrl), infoValues3);
} catch (Exception e) {
Log.d("client", "insertData e2:" + e);
}
}
//删除数据
private void deleteData() {
try {
Log.d("client", "deleteData delete name");
getContentResolver().delete(Uri.parse(nameTableUrl), "id=?", new String[]{"1"});
} catch (Exception e) {
Log.d("client", "deleteData e1:" + e);
}
try {
Log.d("client", "deleteData delete info");
getContentResolver().delete(Uri.parse(infoTableUrl), "info=?", new String[]{"00000"});
} catch (Exception e) {
Log.d("client", "deleteData e2:" + e);
}
}
//更新数据
private void updateData() {
try {
Log.d("client", "updateData update name");
ContentValues nameValues = new ContentValues();
nameValues.put("name", "小黑");
getContentResolver().update(Uri.parse(nameTableUrl), nameValues, "name=?", new String[]{"小红"});
} catch (Exception e) {
Log.d("client", "updateData e1:" + e);
}
try {
Log.d("client", "updateData update info");
ContentValues infoValues = new ContentValues();
infoValues.put("info", "66666");
getContentResolver().update(Uri.parse(infoTableUrl), infoValues, "id=?", new String[]{"2"});
} catch (Exception e) {
Log.d("client", "updateData e2:" + e);
}
}
//查询数据
private void queryData() {
try {
Cursor cursor = getContentResolver().query(Uri.parse(nameTableUrl), null,null, null,null);
if(cursor != null) {
if(cursor.getCount() > 0) {
int i= 1;
while(cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.d("client", "queryData name " + i + ":" + name);
i++;
}
} else {
Log.d("client", "queryData cursor is empty");
}
} else {
Log.d("client", "queryData cursor is null");
}
} catch(Exception e) {
Log.d("client", "queryData queryData e1:" + e);
}
try {
Cursor cursor = getContentResolver().query(Uri.parse(infoTableUrl), null,null, null,null);
if(cursor != null) {
if(cursor.getCount() > 0) {
int i= 1;
while(cursor.moveToNext()) {
String info = cursor.getString(cursor.getColumnIndex("info"));
Log.d("client", "queryData info " + i + ":" + info);
i++;
}
} else {
Log.d("client", "queryData cursor is empty");
}
} else {
Log.d("client", "queryData cursor is null");
}
} catch(Exception e) {
Log.d("client", "queryData e2:" + e);
}
}
}