1. 认识
ContentProvider用于应用B数据库暴露接口, A应用通过ContentResolver访问B接口,读取数据库数据
Uri格式:
content: // com.example.transupportprovider/trains/122
前缀 : // 唯一标识 / 表 / 表id
ContentProvider的前缀就是:content
唯一标识 : 用包名一般
2. 通过ContentResolver 实现 A应用 对 B应用 ContentResolver 暴露接口的访问
A应用暴露接口
2.1 DBHelper.java 提供内部数据库访问
package com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context,int version) {
super(context, "atguigu.db", null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG", "DBHelper onCreate()");
String sql = "create table person(_id integer primary key autoincrement, name varchar,age int)";
db.execSQL(sql);
db.execSQL("insert into person (name, age) values ('Tom1', 11)");
db.execSQL("insert into person (name, age) values ('Tom2', 12)");
db.execSQL("insert into person (name, age) values ('Tom3', 13)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("TAG", "DBHelper onUpgrade()-->"+"oldVersion:"+oldVersion + "newVersion:"+newVersion);
}
}
2.2 PersonProvider.java: 实现ContentProvider 接口暴露方法
package com.example.myapplication;
import android.content.ContentProvider;
import android.content.ContentUris;
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 PersonProvider extends ContentProvider {
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
matcher.addURI("com.example.myapplication.PersonProvider", "/person", 1);
matcher.addURI("com.example.myapplication.PersonProvider", "/person/#", 2);
}
private DBHelper dbHelper;
public PersonProvider() {
Log.e("TAG", "PersonProvider()");
}
@Override
public boolean onCreate() {
Log.e("TAG", "PersonProvider onCreate()");
dbHelper = new DBHelper(getContext(),1);
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Log.e("TAG", "PersonProvider query()");
SQLiteDatabase database = dbHelper.getReadableDatabase();
int code = matcher.match(uri);
if(code==1) {
Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, null);
return cursor;
} else if(code==2) {
long id = ContentUris.parseId(uri);
Cursor cursor = database.query("person", projection, "_id=?", new String[]{id+""}, null, null, null);
return cursor;
} else {
throw new RuntimeException("查询的uri不合法");
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.e("TAG", "PersonProvider insert()");
SQLiteDatabase database = dbHelper.getReadableDatabase();
int code = matcher.match(uri);
if(code==1) {
long id = database.insert("person", null, values);
uri = ContentUris.withAppendedId(uri, id);
database.close();
return uri;
} else {
database.close();
throw new RuntimeException("插入的uri不合法");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.e("TAG", "PersonProvider delete()");
SQLiteDatabase database = dbHelper.getReadableDatabase();
int code = matcher.match(uri);
int deleteCount = -1;
if(code==1) {
deleteCount = database.delete("person", selection, selectionArgs);
} else if(code==2) {
long id = ContentUris.parseId(uri);
deleteCount = database.delete("person", "_id="+id, null);
} else {
database.close();
throw new RuntimeException("删除的uri不合法");
}
database.close();
return deleteCount;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
Log.e("TAG", "PersonProvider update()");
SQLiteDatabase database = dbHelper.getReadableDatabase();
int code = matcher.match(uri);
int updateCount = -1;
if(code==1) {
updateCount = database.update("person", values, selection, selectionArgs);
} else if(code==2) {
long id = ContentUris.parseId(uri);
updateCount = database.update("person", values, "_id="+id, null);
} else {
database.close();
throw new RuntimeException("更新的uri不合法");
}
database.close();
return updateCount;
}
@Override
public String getType(Uri uri) {
return null;
}
}
B应用使用 ContentResolver 访问暴露接口,协议 Uri 的格式
通过ContentResolver 接口,访问ContentProvider 暴露的方法
public static String prividerStr="content://com.example.myapplication.PersonProvider/person";
public void selectProvier(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.myapplication.personprovider/person/1");
uri = Uri.parse(prividerStr);
Cursor cusor = resolver.query(uri, null, null, null, null);
if(cusor!=null){
while(cusor.moveToNext()) {
int id = cusor.getInt(0);
String name = cusor.getString(1);
Toast.makeText(this, id+" : "+name, 1).show();
}
cusor.close();
}
}
public void addFun(View view) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse(prividerStr);
ContentValues values = new ContentValues();
values.put("name", "JACK");
uri = resolver.insert(uri, values);
Toast.makeText(this, uri.toString(), 1).show();
}
public void updateFun(View view) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.myapplication.PersonProvider/person/10");
ContentValues values = new ContentValues();
values.put("name", "JACK2");
int updateCount = resolver.update(uri, values, null, null);
Toast.makeText(this, "updateCount="+updateCount, 1).show();
}
public void deleteFun(View view) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.myapplication.PersonProvider/person/2");
int deleteCount = resolver.delete(uri, null, null);
Toast.makeText(this, "deleteCount="+deleteCount, 1).show();
}
案例, 访问联系人:AndroidManifest.xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
Java 代码:系统已经提供了现成的CONTENT_URI ,把数据库字段封装成了常量
private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE =10 ;
public void selectContacts(View view) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
} else
{
selectContacts();
}
}
public void selectContacts() {
ContentResolver resolver = getContentResolver();
String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
while(cursor.moveToNext()) {
String name = cursor.getString(0);
String number = cursor.getString(1);
Map<String, String> map = new HashMap<String, String>();
map.put("name", name);
map.put("number", number);
Log.e("denganzhi","name:"+name + "number:"+ number);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
selectContacts();
} else
{
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
源码路径:
https://download.csdn.net/download/dreams_deng/12233364