ContentProvider详解
作用:把一个App中的数据库通过Url的形式共享出来,供其他App使用。
首先在App1中创建一个数据库,用SQLiteOpenHelper
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context){
super(context,"Account.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table info(_id integer primary key autoincrement, name varchar(20),money varchar(10))");
db.execSQL("insert into info(name, money) values(?,?)",new String[]{"张三","5000"});
ContentValues cv = new ContentValues();
cv.put("name","李四");
cv.put("money","6000");
db.insert("info",null,cv);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
创建数据库:
MyOpenHelper myOpenHelper = new MyOpenHelper(this); myOpenHelper.getReadableDatabase();
然后用过ContentProvider把数据库共享出来,首先看代码:
public class MyProvider extends ContentProvider {
//定义一个Uri路径匹配器 (匹配不成功的时候会返回一个NO_MATCH返回一个-1)
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERYSUCESS = 0;
private static final int INSERTSUCESS = 1;
private static final int UPADTESUCESS = 2;
private static final int DELETESUCESS = 3;
//创建一个静态代码块,在这里添加Uri
static {
/**
* authority 注意:和清单文件里面定义的一样 com.coderwei.provider/query
*/
sURIMatcher.addURI("com.coderwei.provider","query",QUERYSUCESS );
sURIMatcher.addURI("com.coderwei.provider","insert",INSERTSUCESS );
sURIMatcher.addURI("com.coderwei.provider","update",UPADTESUCESS );
sURIMatcher.addURI("com.coderwei.provider","delete",DELETESUCESS );
}
private MyOpenHelper myOpenHelper;
@Override
public boolean onCreate() {
//初始化MyOpenHelper
myOpenHelper = new MyOpenHelper(getContext());
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if (sURIMatcher.match(uri)==QUERYSUCESS){
//说明路径匹配成功
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
Cursor cursor = db.query("info",projection,selection,selectionArgs,null,null,sortOrder);
//db.close();
//这里不能关闭Cursor
return cursor;
}else {
throw new IllegalArgumentException("uri路径不匹配");
}
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
if (sURIMatcher.match(uri)==INSERTSUCESS){
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
long insert = db.insert("info",null,values);
Uri uri1 = Uri.parse("com.coderwei.insert/"+insert);
//db.close();
return uri1;
}else {
throw new IllegalArgumentException("uri路径不匹配");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
if (sURIMatcher.match(uri)==DELETESUCESS){
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
int delete = db.delete("info",selection,selectionArgs);
//db.close();
return delete;
}else {
throw new IllegalArgumentException("uri路径不匹配");
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
if (sURIMatcher.match(uri)== UPADTESUCESS){
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
int update = db.update("info",values,selection,selectionArgs);
//db.close();
return update;
}else {
throw new IllegalArgumentException("uri路径不匹配");
}
}
}
代码很长,但是很简单,主要把上面四个增删改查方法实现就行,上面的db.close()关闭的时候报错了,所以就注释掉了,关不关都可以。
Insert方法返回的是一个Url对象,直接自己写一个就行了。
记得在Manifest.xml中配置ContentProvider:
<provider
android:authorities="com.coderwei.provider"
android:exported="true"
android:name=".MyProvider">
</provider>
android:authorities 自己随便给一个字符串,
android:exported="true"一定要写上这句,这句话表示可以被另一个Application的组件启动,没写可能会报错。
sURIMatcher.addURI("com.coderwei.provider","query",QUERYSUCESS );中的com.coderwei.provider就是这个字符串。
然后就是来到App2了,先看代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click1(View v){
doQuery();
}
public void click2(View v){
doInsert();
}
public void click3(View v){
doDelete();
}
public void click4(View v){
doUpdate();
}
private void doQuery(){
Uri uri = Uri.parse("content://com.coderwei.provider/query");
Cursor cursor = getContentResolver().query(uri,new String[]{"name","money"},null,null,null);
if (cursor!=null){
while (cursor.moveToNext()){
String name = cursor.getString(0);
String money = cursor.getString(1);
System.out.println("name:"+name+" money: "+money);
}
}
}
private void doInsert(){
Uri uri = Uri.parse("content://com.coderwei.provider/insert");
ContentValues cv = new ContentValues();
cv.put("name","王五");
cv.put("money","800");
Uri uri1 = getContentResolver().insert(uri,cv);
System.out.println("插入uri1:"+uri1);
}
private void doDelete(){
Uri uri = Uri.parse("content://com.coderwei.provider/delete");
int delete = getContentResolver().delete(uri,"name=?",new String[]{"王五"});
System.out.print("刪除了: "+delete);
}
private void doUpdate(){
Uri uri = Uri.parse("content://com.coderwei.provider/update");
ContentValues cv = new ContentValues();
cv.put("money","9000");
int update = getContentResolver().update(uri,cv,"name=?",new String[]{"王五"});
System.out.println("更新了:"+update);
}
}
里面就是四个增删改查方法,就Query稍微麻烦一点,查询的结果返回一个Cursor对象,然后把这个Cursor对象的内容取出来就行了,
ContentProvider详解的更多相关文章
- Android开发数据存储之ContentProvider详解
转载:十二.ContentProvider和Uri详解 一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可 ...
- 【转】android四大组件--ContentProvider详解
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- Android四大组件--ContentProvider详解(转)
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- Android面试收集录3 ContentProvider详解
1.ContentProvider简单介绍 1.1.定义 ContentProvider,即内容提供者属于Android的四大组件之一. 1.2.作用 进程间进行数据交互&共享,即跨进程通信. ...
- Android ContentProvider详解
1.概述 ContentProvider以Uri的形式对外提供数据,允许其他应用程序访问或者修改数据.也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过 ...
- ContentProvider数据访问详解
ContentProvider数据访问详解 Android官方指出的数据存储方式总共有五种:Shared Preferences.网络存储.文件存储.外储存储.SQLite,这些存储方式一般都只是在一 ...
- Android ContentProvider 基本原理和使用详解
ContentProvider(内容提供者)是 Android 的四大组件之一,管理 Android 以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他 ...
- Android proguard 详解
本文转载于:http://blog.csdn.net/banketree/article/details/41928175 简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往 ...
- [转]AndroidManifest.xml文件详解
转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...
随机推荐
- linux关于文件的那些事儿
一个文件的权限对于系统的安全来说是很重要的,linux是一个支持多任务多用户的系统,我们都不希望一些自己的文件被别人看到或者修改! 对于一个文件的权限我们可以用 ls -l 命令来查看,例如: [ro ...
- Windows Azure 虚拟机备份
如果我们要在Windows Azure的虚拟机上进行一些“重要且高危”的操作,我们通常会想到使用快照或者备份功能.但是在Windows Azure上是没有虚拟机快照功能的,尽管我们可以对虚拟机的磁盘文 ...
- 编写NPAPI plugin的命名问题
最近写了个NPAPI的插件,在chrome上用得好好的,结果在火狐上死活不认我的插件,找了N多资料最后在官方的说明里才找到说火狐浏览器的插件的文件名必须是以np开头的,立刻吐血三升,难怪被chrome ...
- Pairs Forming LCM(素因子分解)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/B 全题在文末. 题意:在a,b中(a,b<=n) ...
- Caffe源码解析1:Blob
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob这个类,Blob是作为Caffe中数据流通的 ...
- jquery实现输入框聚焦,键盘上下键选择城市
在最近有个项目中 需要实现当文本框聚焦的时候,可以键盘上下键选择内容,按enter键的时候,把内容传到输入框中,如图所示: 实现代码如下: /** *输入框聚焦,键盘上下键选择城市 */ ;(func ...
- POJ 1066 Treasure Hunt【线段相交】
思路:枚举四边墙的门的中点,与终点连成一条线段,判断与其相交的线段的个数.最小的加一即为答案. 我是傻逼,一个数组越界调了两个小时. #include<stdio.h> #include& ...
- BZOJ2118墨墨的等式[数论 最短路建模]
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1317 Solved: 504[Submit][Status][Discus ...
- 第63课 C语言异常处理
1. 异常的概念 (1)程序在运行过程中可能产生异常 (2)异常(Exception)与Bug的区别 ①异常是程序运行时可预料的执行分支 ②Bug是程序是的错误,是不被预期的运行方式 2. 异常和Bu ...
- HTML插入地图的方法
方法/步骤 1.打开"百度地图生成器"的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html 如下图: 2.在"1 ...