ContentProvider:内容提供者的作用就是把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用。
一. 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码。
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", null, values);
return uri;
}
二. 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址
<provider android:name="com.itheima.contentprovider.PersonProvider"
android:authorities="com.itheima.person"
android:exported="true"
></provider>
三.创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作
public void click(View v){
//得到内容分解器对象
ContentResolver cr = getContentResolver();
ContentValues cv = new ContentValues();
cv.put("name", "小方");
cv.put("phone", 138856);
cv.put("money", 3000);
//url:内容提供者的主机名
cr.insert(Uri.parse("content://com.itheima.person"), cv);
}
四.uri携带数据,数据包括表名或者数字,字符串等。
a)添加匹配规则
//创建uri匹配对象
static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
//检查其他用户传入的uri与匹配器定义好的uri中,哪条匹配
static {
um.addURI("com.example.people", "person", 1);//content://com.example.people/person
um.addURI("com.example.people", "teacher", 2);//content://com.example.people/teacher
um.addURI("com.example.people", "person/#", 3);//content://com.example.people/teacher/3
}
b)通过Uri匹配器可以实现操作不同的表
public int delete(Uri uri, String selection, String[] selectionArgs) {
int i;
if(um.match(uri) == 1){
i = db.delete("person", selection, selectionArgs);
}else if(um.match(uri) == 2){
i = db.delete("teacher", selection, selectionArgs);
}else{
throw new IllegalArgumentException("uri有问题");
}
return i;
}
c)如果路径中带有数字,把数字提取出来
if(um.match(uri) == 3){
//把uri末尾携带的数字取出来
long id = ContentUris.parseId(uri);
cursor = db.query( "person", projection, "_id = ?", new String[]{id+""}, null, null, sortOrder, null);
}
代码实例
自定义内容提供者
package com.example.provider;
import com.example.lzz.MyOpenHelper;
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;
public class PersonProvider extends ContentProvider {
private MyOpenHelper oh;
SQLiteDatabase db;
//创建uri匹配对象
static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
//检查其他用户传入的uri与匹配器定义好的uri中,哪条匹配
static {
um.addURI("com.example.people", "person", 1);//content://com.example.people/person
um.addURI("com.example.people", "teacher", 2);//content://com.example.people/teacher
um.addURI("com.example.people", "person/#", 3);//content://com.example.people/teacher/3
}
//内容提供者创建时调用
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
oh = new MyOpenHelper(getContext());
db = oh.getWritableDatabase();
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Cursor cursor = null;
if(um.match(uri) == 1){
cursor = db.query( "person", projection, selection, selectionArgs, null, null, sortOrder, null);
}else if(um.match(uri) == 2){
cursor = db.query( "teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
}else if(um.match(uri) == 3){
//把uri末尾携带的数字取出来
long id = ContentUris.parseId(uri);
cursor = db.query( "person", projection, "_id = ?", new String[]{id+""}, null, null, sortOrder, null);
}
else{
throw new IllegalArgumentException("uri有问题");
}
return cursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
//此方法供其他应用调用,用于往people数据库插入数据
//values由其他应用传入,用于封装要插入的数据
//uri:内容提供者的主机名也就是访问地址
@Override
public Uri insert(Uri uri, ContentValues values) {
//使用uri匹配器匹配传入的uri
if(um.match(uri) == 1){
db.insert("person", null, values);
}else if(um.match(uri) == 2){
db.insert("teacher", null, values);
}else{
throw new IllegalArgumentException("uri有问题");
}
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int i;
if(um.match(uri) == 1){
i = db.delete("person", selection, selectionArgs);
}else if(um.match(uri) == 2){
i = db.delete("teacher", selection, selectionArgs);
}else{
throw new IllegalArgumentException("uri有问题");
}
return i;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int i = db.update("person", values, selection, selectionArgs);
if(um.match(uri) == 1){
i = db.update("person", values, selection, selectionArgs);
}else if(um.match(uri) == 2){
i = db.update("teacher", values, selection, selectionArgs);
}else{
throw new IllegalArgumentException("uri有问题");
}
return i;
}
}
访问自定义内容提供者
package com.example.visitprovider;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void insert(View v){
//通过内容提供者把数据插入people数据库
//拿到contentResolver
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "校长");
values.put("money", "13333");
//uri:内容提供者的主机名
//values要插入的数据
cr.insert(Uri.parse("content://com.example.people/teacher"), values);
values.put("name", "张老师");
values.put("money", "33333");
cr.insert(Uri.parse("content://com.example.people/teacher"), values);
values.put("name", "李老师");
values.put("money", "123456");
cr.insert(Uri.parse("content://com.example.peopleteacher/teacher"), values);
}
public void delete(View v){
ContentResolver cr = getContentResolver();
cr.delete(Uri.parse("content://com.example.people/person"), "name = ?", new String[]{"校长"});
}
public void updata(View v){
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "新张三");
int i = cr.update(Uri.parse("content://com.example.people/person"), values,"name = ?", new String[]{"张三"});
System.out.println(i);
}
public void select(View v){
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(Uri.parse("content://com.example.people/person/4"), null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(1);
String money = cursor.getString(2);
System.out.println("name:"+name+"money:"+money);
}
}
}