您的位置:首页 > 编程语言 > PHP开发

安卓 ContentProvide

2015-07-03 23:51 615 查看
ContentProvider主要是一个数据库帮助类,UriMatcher是一个匹配树,说白了想访问数据库,通过UriMatcher与传进来的Uri匹配,根据返回的匹配结果,知道你想要干什么,比如我们想查询groups表,uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL),这句代码的意思是给匹配树(uriMatcher)添加一个匹配结果,也就是传进来的Uri满足uri=AUTHORITY/groups,(AUTHORITY是String类型,后面会说到,其值必须等于我们在AndroidManifest.xml文件中注册ContentProvider的这个属性值 android:authorities="com.itheima26.smsmanager.provider.GroupContentProvider",即"com.itheima26.smsmanager.provider.GroupContentProvider")调用uriMatcher.match(uri)就返回GROUPS_QUERY_ALL;GROUPS_QUERY_ALL是我们自己随便定义的整数,之后我们对传进来的Uri调用uriMatcher.match(uri),如果匹配成功,返回GROUPS_QUERY_ALL,我们再做我们想进行的操作,例如查询特定的表,或进行添加删除操作,另外ContentProvider必须注册,注册方式为

<provider 

            android:name="provider.GroupProvider"

            android:authorities="com.itheima26.smsmanager.provider.GroupContentProvider"

            >

另外自定义ContentProvider类(例如 myContentProvider extends ContentProvider)中的AUTHORITY变量=android:authorities="com.itheima26.smsmanager.provider.GroupContentProvider"

name为当前定义GroupProvider 类的全路径名(即包名 . 类名),authorities为我们自己随便定义的Uri,也就是其他代码段或程序想访问本程序的自定义的ContentProvider里面的方法,必须要通过这个Uri进行访问,(例如uri=“content://com.itheima26.smsmanager.provider.GroupContentProvider/ ....."),前面必须是这样,要不然就找不到ContentProvider,传进来的Uri一般是以下生成的其中一种Uri,例如在另一个程序的Activity中我们可以这样写

getContentResolver().query(Uri.parse(“content://com.itheima26.smsmanager.provider.GroupContentProvider/groups/insert"), projection, selection, selectionArgs, sortOrder); 

uriMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT); 等价于 URI=“content://com.itheima26.smsmanager.provider.GroupContentProvider/groups/insert"其他类似,当然我们可以定义很多匹配Uri,
uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);等价于URI= “ content://com.itheima26.smsmanager.provider.GroupContentProvider/groups”
uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);
uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);
uriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);
uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_SINGLE_DELETE);

例如uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);它得到的URI=AUTHORITY/groups;

AUTHORITY等于前面定义的    android:authorities="com.itheima26.smsmanager.provider.GroupContentProvider"里面的com.itheima26.smsmanager.provider.GroupContentProvide这个,ContentProvider一般程序一运行就会调用自身的OnCreate()方法(必须已经注册),所以创建数据库的操作可以定义在这个方法里面,例如mOpenHelper=new GroupDataBase(getContext());mOpenHelper是自定义的一个继承SQLiteOpenHelper的类,帮助我们创建数据库,

此时会执行mOpenHelper中的构造方法,

private GroupDataBase(Context context, String name, CursorFactory factory,
int version) {

super(context, name, factory, version);
}

如果调用并不会创建数据库,而是等我们调用mOpenHelper.getWritableDatabase();或者读方法(mOpenHelper.getReadableDatabase();  )的时候,才会执行mOpenHelper中的OnCreate方法创建数据库和表(只有onCreate方法中有建表操作才会有表),如果version发生变化onUpgrade方法就会被调用

package db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

public class GroupDataBase extends SQLiteOpenHelper{
private static GroupDataBase mInstance;
private GroupDataBase(Context context, String name, CursorFactory factory,
int version) {

super(context, name, factory, version);
}
/**
* 获得对象
* @param context
* @return
*/
public static GroupDataBase getInstance(Context context) {
if(mInstance == null) {
synchronized (GroupDataBase.class) {
if(mInstance == null) {
mInstance = new GroupDataBase(context, "itheima26.db", null, 3);
}
}
}
return mInstance;
}
@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) {
//System.out.println("更新");

}

}

package provider;

import util.ConstantURI;

import db.GroupDataBase;

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 GroupProvider extends ContentProvider{
private static final String AUTHORITY = "com.itheima26.smsmanager.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 GroupDataBase mOpenHelper;
SQLiteDatabase  dataBase;
private final String GROUPS_TABLE = "groups";// 群组表名
private final String THREAD_GROUP_TABLE = "thread_group";// 关联关系表名

static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT);
// content://com.itheima26.smsmanager.provider.GroupContentProvider/groups
uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);
uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);
uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);
uriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);
uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_SINGLE_DELETE);
}

@Override
public boolean onCreate() {
mOpenHelper=new GroupDataBase(getContext());

return false;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
dataBase=mOpenHelper.getReadableDatabase();                   
switch (uriMatcher.match(uri)) {
case GROUPS_QUERY_ALL:// 查询所有的群组数据
if(dataBase.isOpen()) {
Cursor cursor = dataBase.query(GROUPS_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
// 给游标结果集设置一个通知的uri
cursor.setNotificationUri(getContext().getContentResolver(), ConstantURI.GROUPS_QUERY_ALL_URI);
return cursor;
}
case THREAD_GROUP_QUERY_ALL:// 查询所有关联关系表的内容
if(dataBase.isOpen()) {
Cursor cursor = dataBase.query(THREAD_GROUP_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
break;
default:
throw new IllegalArgumentException("UnKnow Uri : " + uri);

}
return null;
}

@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
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);
// 通知Sms.GROUPS_QUERY_ALL_URI, 数据改变了, 它会执行重新查询操作, 更新数据
getContext().getContentResolver().notifyChange(ConstantURI.GROUPS_QUERY_ALL_URI, null);
return ContentUris.
c0c6
withAppendedId(uri, id);
}
break;
case THREAD_GROUP_INSERT:// 添加到关联关系表中
if(db.isOpen()) {
long id = db.insert(THREAD_GROUP_TABLE, null, values);
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()) {
long group_id=ContentUris.parseId(uri);
String where = "_id = " + group_id;
int count = db.delete(GROUPS_TABLE, where, null);// 真正删除群组     
// 通知Sms.GROUPS_QUERY_ALL_URI, 数据改变了, 它会执行重新查询操作, 更新数据
getContext().getContentResolver().notifyChange(ConstantURI.GROUPS_QUERY_ALL_URI, null);
// 根据群组的id去关联关系表中删除对应群组id所有的条目
where = "group_id = " + group_id;
db.delete(THREAD_GROUP_TABLE, where, null);// 删除当前群组的所有关联关系
return count;

}
}
return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
switch (uriMatcher.match(uri)) {
case GROUPS_UPDATE:// 更新群组表的操作
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) {
int count = db.update(GROUPS_TABLE, values, selection, selectionArgs);
// 通知Sms.GROUPS_QUERY_ALL_URI, 数据改变了, 它会执行重新查询操作, 更新数据
getContext().getContentResolver().notifyChange(ConstantURI.GROUPS_QUERY_ALL_URI, null);
return count;
}
break;
default:
throw new IllegalArgumentException("UnKnow Uri : " + uri);
}
return 0;
}

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