您的位置:首页 > 数据库

Android中通过ContentProvider操作数据库

2016-11-03 17:03 232 查看
一直以来都在CSDN上学习大神们的分享,自己也没写过什么东西,也写不出什么东西,呵呵!但是发现每次遇到不会的东西都会去搜索,但下次遇到后还是得重新搜索,所以,现在决定把自己在学习中遇到的问题和知识点记录下来,一方面方便自己复习,另一方面也希望能够帮助到遇到问题的朋友们。
今天分享一下在使用ContentProvider和ContentObserver时遇到的问题和解决方法;


目录

自定义contentProvider

注册ContentObserver

注销ContentObserve

自定义ContentProvider

在改变数据库后调用getContext().getContentResolver().notifyChange(uri, null);这句必须有,自定义的contentprovider必须要自己notify后,ContentObserve才会收到数据库变化的消息;其中两个参数分别是Uri和ContentObserve,这个Uri必须和你注册ContentObserver时的uri一致,否则收不到消息;至于ContentObserve最好是null;


public class MsgContentProvide extends ContentProvider {
SQLiteDatabase database;
DBHelper helper;
public static String ORDER_CONTENT = "content://com.locensate.message/order_msg";
@Override
public boolean onCreate() {
helper = new DBHelper(getContext());
database = helper.getWritableDatabase();
return false;
}
UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
{
um.addURI("com.locensate.message", "order_msg", 1);//content://com.locensate.message/order_msg
um.addURI("com.locensate.message", "ring", 2);//content://com.locensate.message/ring
um.addURI("com.locensate.message", "order_msg/#", 3);//content://com.locensate.message/ring/3
um.addURI("com.locensate.message", "ring/#", 4);
um.addURI("com.locensate.message", "ring_strategy", 5);//content://com.locensate.message/ring_strategy
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
if (um.match(uri) == 1) {
database.insert("order_msg", null, values);
} else if (um.match(uri) == 2) {
database.insert("ring", null, values);
} else if (um.match(uri) == 5) {
database.insert("ring_strategy", null, values);
} else {
throw new IllegalArgumentException("insert:内容提供者uri参数异常.");
}
getContext().getContentResolver().notifyChange(Uri.parse(ORDER_CONTENT), null);
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int i = 0;
if (um.match(uri) == 1) {
i = database.delete("order_msg", selection, selectionArgs);
} else if (um.match(uri) == 2) {
i = database.delete("ring", selection, selectionArgs);
} else if (um.match(uri) == 5) {
i = database.delete("ring_strategy", selection, selectionArgs);
} else {
throw new IllegalArgumentException("delete:内容提供者uri参数异常.");       }
getContext().getContentResolver().notifyChange(Uri.parse(ORDER_CONTENT), null);
return i;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int i = 0;
if (um.match(uri) == 1) {
i = database.update("order_msg", values, selection, selectionArgs);
} else if (um.match(uri) == 2) {
i = database.update("ring", values, selection, selectionArgs);
} else {
throw new IllegalArgumentException("update:内容提供者uri参数异常");
}
getContext().getContentResolver().notifyChange(Uri.parse(ORDER_CONTENT), null);
return i;
}

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
if (um.match(uri) == 1) {
cursor = database.query("order_msg", projection, selection, selectionArgs, null, null, null, null);
} else if (um.match(uri) == 2) {
cursor = database.query("ring", projection, selection, selectionArgs, null, null, null, null);
} else if (um.match(uri) == 5) {
cursor = database.query("ring_strategy", projection, selection, selectionArgs, null, null, null, null);
} else if (um.match(uri) == 3) {
long id = ContentUris.parseId(uri);//拿出要查询的数字
cursor = database.query("order_msg", projection, "_id = ?", new String[]{id + ""}, null, null, null, null);
} else if (um.match(uri) == 4) {
long id = ContentUris.parseId(uri);//拿出要查询的数字
cursor = database.query("ring", projection, "_id = ?", new String[]{id + ""}, null, null, null, null);
} else {
throw new IllegalArgumentException("query :内容提供者uri参数异常");
}
return cursor;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}


注册ContentObserve

注册完ContentObserve后再主线程中的handler中处理你的逻辑代码就Ok了;

private void registerContentObservers() {
observer = new MessageContentObserver(handler);
getContentResolver().registerContentObserver(Uri.parse(MsgContentProvide.ORDER_CONTENT), //数据库的路径Uri
false, //这个参数表示是否遵从Uri的路径去模糊匹配;true表示只要Uri的开头匹配就响应;false表示,根据绝对路径匹配
observer);
}

class MessageContentObserver extends ContentObserver {
public MessageContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
LogUtil.e("MsgContentObserver+++++++", "+++++++=============Database changed !");
handler.sendEmptyMessage(748);
}
}


最后在activity的Ondestroy方法中注销就好了:

@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(observer);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: