ContentProvider 数据库共享总结
* Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,
Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。
* 让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类)
或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数
据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model)
和 URI。
* Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种多应用间数据共享的方式,
比如:联系人信息可以被多个应用程序访问。Content Provider是个实现了一组用于提供其他应用程序存取数据的标准方法的类。
* 应用程序可以在Content Provider中执行如下操作:
查询数据
修改数据
添加数据
删除数据
【实例使用步骤】
①:编写类继承自SQLiteOpenHelper用于建立数据表,当然若已存在数据表可跳过此步骤
②:建立继承自ContentProvider的自定义内容提供者类,复写以下方法
public boolean onCreate(); // 用于获取数据库访问对象
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String orderBy); // 执行数据库查询操作
public Uri insert(Uri uri, ContentValues values); // 执行数据库添加操作
public int delete(Uri uri, String selection, String[] selectionArgs); // 执行数据库删除操作
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs); // 执行数据库更新操作
在该类中通过静态代码块执行对访问URI的建立和匹配
③:在Mainifest.xml中添加配置,参见源码
④:每一个应用程序上下文都有一个单独的ContentResolver,在适当位置通过getContentResolver获取.
再根据提供的Uri访问数据库,执行增删改查操作。
【源代码如下:】
/****************************************【源码】START**************************************************/
// 1. GroupOpenHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class GroupOpenHelper extends SQLiteOpenHelper {
private static GroupOpenHelper instance;
public static GroupOpenHelper getInstance(Context context) {
if(instance == null){
synchronized (GroupOpenHelper.class) {
instance = new GroupOpenHelper(context, "smsmanager.db", null, 1);
}
}
return instance;
}
private GroupOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 群组表
String sql = "create table groups(_id integer primary key, group_name varchar(30));";
db.execSQL(sql);
// 关联关系表
sql = "create table thread_group(_id integer primary key,group_id integer,thread_id integer);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
import cn.gzu.smsmana.dao.GroupOpenHelper;
import cn.gzu.smsmana.utils.Sms;
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;
/**
* =========================================================
* @author Administrator
* @description TODO 群组 和 群组关联关系 数据表内容提供
* @since 2014-9-30 下午7:25:27
* =========================================================
*/
public class GroupContentProvider extends ContentProvider {
private static final String AUTHORITY = "cn.gzu.smsmana.provider.GroupContentProvider";
private static final int GROUPS_INSERT = 0; // 添加到群组的匹配码
private static final int GROUPS_QUERY_ALL = 1;
private static final int THREAD_GROUP_QUERY_ALL = 2;
private static final int THREAD_GROUP_INSERT = 3;
private static final int GROUPS_UPDATE = 4;
private static final int GROUPS_SINGLE_DELETE = 5;
private static UriMatcher uriMatcher;
private GroupOpenHelper mOpenHelper;
private final String GROUPS_TABLE = "groups"; // 群组表名
private final String THREAD_GROUP_TABLE = "thread_group"; // 关联关系表名
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// code that is returned when a URI is matched against the given components. Must be positive.
// content://cn.gzu.smsmana.provider.GroupContentProvider/groups/insert
// 新建群组
uriMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT);
// content://cn.gzu.smsmana.provider.GroupContentProvider/groups
// 查询所有群组信息
uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);
// content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group
// 查询所有关联关系信息
uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);
// content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group/insert
// 插入关联关系信息
uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);
// content://cn.gzu.smsmana.provider.GroupContentProvider/groups/update
// 修改群组信息
uriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);
// content://cn.gzu.smsmana.provider.GroupContentProvider/groups/delete/#
// 删除群组信息
uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_SINGLE_DELETE);
}
@Override
public boolean onCreate() {
mOpenHelper = GroupOpenHelper.getInstance(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String orderBy) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
switch(uriMatcher.match(uri)){
case GROUPS_QUERY_ALL: // 查询所有的群组数据
if(db.isOpen()){
Cursor cursor = db.query(GROUPS_TABLE, projection,
selection, selectionArgs, null, null, orderBy);
// 给游标结果集设置一个通知的uri 数据改变了, 它会执行重新查询操作, 更新数据
cursor.setNotificationUri(getContext().getContentResolver(), Sms.GROUPS_QUERY_ALL_URI);
return cursor;
}
break;
case THREAD_GROUP_QUERY_ALL: // 查询所有关联关系表的内容
if(db.isOpen()){
Cursor cursor = db.query(THREAD_GROUP_TABLE, projection,
selection, selectionArgs, null, null, orderBy);
return cursor;
}
break;
default:
throw new IllegalArgumentException("UnKnow Uri : " + uri);
}
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch(uriMatcher.match(uri)){
case GROUPS_INSERT: // 插入群组数据
if(db.isOpen()){
long id = db.insert(GROUPS_TABLE, null, values);
// 通知对应的uri 数据改变了, 它会执行重新查询操作, 更新数据
getContext().getContentResolver().notifyChange(Sms.GROUPS_INSERT_URI, null);
return ContentUris.withAppendedId(uri, id);
}
break;
case THREAD_GROUP_INSERT: // 插入关联关系表内容
if(db.isOpen()){
long id = db.insert(THREAD_GROUP_TABLE, null, values);
// 将插入id添加到uri 删除时使用
return ContentUris.withAppendedId(uri, id);
}
break;
default:
throw new IllegalArgumentException("UnKnow Uri : " + uri);
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch(uriMatcher.match(uri)){
case GROUPS_SINGLE_DELETE: // 删除群组数据
if(db.isOpen()){
// 根据uri获取到要删除的项目id
long id = ContentUris.parseId(uri);
String where = " _id = " + id;
// 删除单个项目
int count = db.delete(GROUPS_TABLE, where, null);
// 通知对应的uri 数据改变了, 它会执行重新查询操作, 更新数据
getContext().getContentResolver().notifyChange(Sms.GROUPS_SINGLE_DELETE_URI, null);
where = "group_id = " + id;
// 删除在关联关系中的记录
db.delete(THREAD_GROUP_TABLE, where, null);
return count;
}
break;
default:
throw new IllegalArgumentException("UnKnow Uri : " + uri);
}
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch(uriMatcher.match(uri)){
case GROUPS_UPDATE: // 插入群组数据
if(db.isOpen()){
int count = db.update(GROUPS_TABLE, values, selection, selectionArgs);
// 通知对应的uri 数据改变了, 它会执行重新查询操作, 更新数据
getContext().getContentResolver().notifyChange(Sms.GROUPS_UPDATE_URI, null);
return count;
}
break;
default:
throw new IllegalArgumentException("UnKnow Uri : " + uri);
}
return 0;
}
}
package cn.gzu.smsmana.utils;
import android.net.Uri;
public class Sms {
///////////////////////// ContentProvider使用Uri //////////////////////////////////////
/**
* 添加到群组的uri
*/
public static final Uri GROUPS_INSERT_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups/insert");
/**
* 查询所有群组的uri
*/
public static final Uri GROUPS_QUERY_ALL_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups");
/**
* 查询所有关联关系表中的内容的uri
*/
public static final Uri THREAD_GROUP_QUERY_ALL_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group");
/**
* 添加到关联关系表的uri
*/
public static final Uri THREAD_GROUP_INSERT_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/thread_group/insert");
/**
* 更新群组表的uri
*/
public static final Uri GROUPS_UPDATE_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups/update");
/**
* 删除群组的uri(删除群组会删除其所带的关联关系)
*/
public static final Uri GROUPS_SINGLE_DELETE_URI = Uri.parse("content://cn.gzu.smsmana.provider.GroupContentProvider/groups/delete/#");
}
public class SmsDetailActivity extends Activity
{
//....省略部分代码
// 添加数据
private void createGroup(String groupName) {
ContentValues values = new ContentValues();
values.put("group_name", groupName);
Uri uri = getContentResolver().insert(Sms.GROUPS_INSERT_URI, values);
if(ContentUris.parseId(uri) >= 0) {
Toast.makeText(this, "群组创建成功", 0).show();
}
}
// 删除数据
private void deleteGroup(String group_id) {
Uri uri = ContentUris.withAppendedId(Sms.GROUPS_SINGLE_DELETE_URI, Long.valueOf(group_id));
int count = getContentResolver().delete(uri, null, null);
if(count > 0) {
Toast.makeText(this, "删除成功", 0).show();
} else {
Toast.makeText(this, "删除失败", 0).show();
}
}
// 更新群组
private void updateGroup(String group_id, String group_name) {
ContentValues values = new ContentValues();
values.put("group_name", group_name);
String where = "_id = " + group_id;
int count = getContentResolver().update(Sms.GROUPS_UPDATE_URI, values, where, null);
if(count > 0) {
Toast.makeText(this, "修改成功", 0).show();
} else {
Toast.makeText(this, "修改失败", 0).show();
}
}
// 查询数据
private void prepareData() {
CommonAsyncQuery asyncQuery = new CommonAsyncQuery(getContentResolver());
asyncQuery.startQuery(0, mAdapter, Sms.GROUPS_QUERY_ALL_URI, null, null, null, null);
}
}
/****************************************【源码】END**************************************************/