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

Android四大组件之一内容提供者

2016-03-13 21:28 906 查看
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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android