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

四大应用组件之ContentProvider【Android】

2016-09-13 08:47 323 查看
一、概述

ContentProvider是四大应用组件之一

当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问

其它应用需要使用ContentResolver来调用ContentProvider的方法

它们之间的调用是通过Uri来进行交流的

二、相关API

1.内容提供者类

//provider对象创建后调用(应用安装成功或手机启动完成)
public abstract boolean onCreate();

//查询表数据
Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs)

//插入表数据
Uri insert(Uri uri, ContentValues values);

//删除表数据
int delete(Uri uri, String selection, String[] selectionArgs)

//更新表数据
update(Uri uri, ContentValues values, String selection,String[] selectionArgs);


2.ContentResolver:  内容提供者的解析类

//得到它的对象
context.getContentResolver()

//调用provider进行数据库CRUD操作
Insert()、delete()、update()、query()

//注册uri的监听
registerContentObserver(Uri uri, boolean notify,ContentObserver observer)

//解注册uri的监听
unregisterContentObserver(ContentObserver observer)

//通知监听器
notifyChange(Uri uri, ContentObserver observer)
3.Uri: 包含请求地址数据的类

//得到其对象
Uri static parse(String uriString)



A : 是一个前缀,表示是由ContentProvider提供,固定不变

B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。

C : 对应于哪张表 student

D : id值, 对应表中的哪条记录

4.UriMatcher : 用于匹配Uri的容器

//添加一个合法的URI
void addURI(String authority, String path, int code)

//匹配指定的uri, 返回匹配码
int match(Uri uri)


5.ContentUris : 解析uri的工具类

//解析uri, 得到其中的id
long parseId(Uri contentUri)

//添加id到指定的uri中
Uri withAppendedId(Uri contentUri, long id)
三、代码实现

1.编写ContentProvider子类

package com.example.provider;

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;

/**
* 操作person表的provider类
*
* @author Xiaocici
*
*/
public class PersonProvider extends ContentProvider {

// 用来存放所有合法的Uri的容器
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
// 保存一些合法的uri
// content://com.example.provider.personprovider/person 不根据id操作
// content://com.example.provider.personprovider/person/3 根据id操作
static {
matcher.addURI("com.example.provider.personprovider", "/person", 1);
matcher.addURI("com.example.provider.personprovider", "/person/#", 2);// #匹配任意数字
}

private DBHelper dbHelper;

public PersonProvider() {
Log.e("TAG", "PersonProvider()");
}

@Override
public boolean onCreate() {
Log.e("TAG", "onCreate()");
dbHelper = new DBHelper(getContext());
return false;
}

/**
* content://com.example.provider.personprovider/person 不根据id查询
* content://com.example.provider.personprovider/person/3 根据id查询
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Log.e("TAG", "query()");

// 得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 1.匹配uri,返回code
int code = matcher.match(uri);
// 如果合法,进行查询
if (code == 1) {// 不根据id查询
Cursor cursor = database.query("person", projection, selection,
selectionArgs, null, null, null);
return cursor;
} else if (code == 2) {// 根据id查询
// 得到id
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 String getType(Uri uri) {
Log.e("TAG", "getType()");
return null;
}

/**
* content://com.example.provider.personprovider/person 插入
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.e("TAG", "insert()");
// 得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 匹配uri,返回code
int code = matcher.match(uri);
// 如果合法,进行插入
if (code == 1) {
long id = database.insert("person", null, values);
//将id添加到uri中
uri = ContentUris.withAppendedId(uri, id);
database.close();
return uri;
} else {// 如果不合法,抛出异常
database.close();
throw new RuntimeException("插入的uri不合法");
}
}

/**
* content://com.example.provider.personprovider/person 不根据id删除
* content://com.example.provider.personprovider/person/3 根据id删除
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.e("TAG", "delete()");
// 得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 匹配uri,返回code
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;
}

/**
* content://com.example.provider.personprovider/person 不根据id更新
* content://com.example.provider.personprovider/person/3  根据id更新
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
Log.e("TAG", "update()");
// 得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 匹配uri,返回code
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;
}

}
2.在manifest.xml中注册

<span style="white-space:pre">	</span><provider android:name="com.example.provider.PersonProvider"
android:exported="true"
android:authorities="com.example.provider.personprovider"/>
<!-- exported :是否可以让其它应用访问 -->
3.得到其对象

ContentResolver resolver = getContentResolver();
4.使用其对象

inert()、delete()、update()和query()
系统自动找到匹配的ContentProvider对象来操作数据

registerContentObserver(Uri uri, boolean notify,ContentObserver observer)
注册uri的监听

unregisterContentObserver(ContentObserver observer)
解注册uri的监听

notifyChange(Uri uri, ContentObserver observer)
通知监听器


package com.example.resolver;

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.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

/*
* 通过ContentResolver调用ContentProvider插入一条记录
*/
public void insert(View v){
//1.得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2.调用其insert
Uri uri = Uri.parse("content://com.example.provider.personprovider/person/");
ContentValues values = new ContentValues();
values.put("name", "Jack");
Uri insert = resolver.insert(uri, values);
Toast.makeText(this,insert.toString(), 1).show();
}

/*
* 通过ContentResolver调用ContentProvider更新一条记录
*/
public void update(View v){
//1.得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2.执行update
Uri uri = Uri.parse("content://com.example.provider.personprovider/person/2");
ContentValues values = new ContentValues();
values.put("name", "Jack2");
int updateCount = resolver.update(uri, values, null, null);
Toast.makeText(this,"updateCount="+updateCount, 1).show();
}

/*
* 通过ContentResolver调用ContentProvider删除一条记录
*/
public void delete(View v){
//1.得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2.执行delete
Uri uri = Uri.parse("content://com.example.provider.personprovider/person/2");

int deleteCount = resolver.delete(uri, null, null);
Toast.makeText(this,"deleteCount="+deleteCount, 1).show();
}

/*
* 通过ContentResolver调用ContentProvider查询所有记录
*/
public void query(View v){
//1.得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2.调用其query,得到cursor
Uri uri = Uri.parse("content://com.example.provider.personprovider/person/");
Cursor cursor = resolver.query(uri, null, null, null, null);
//3.取出cursor中的数据,并显示
while(cursor.moveToNext()){
int id = cursor.getInt(0);
String name = cursor.getString(1);
Toast.makeText(this, id+":"+name, 0).show();
}
cursor.close();
}
}
5.数据库操作

package com.example.provider;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context) {
super(context, "atschool.db", null, 1);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG", "onCreate()");
//建表
db.execSQL("create table person(_id integer primary key autoincrement,name varchar)");
//插入初始化数据
db.execSQL("insert into person (name) values ('TOM')");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: