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 ...
随机推荐
- x01.os.8: 加载内核
在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简 ...
- 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS
上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...
- hdu 5057 Argestes and Sequence(分块算法)
Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Hadoop2.6 datanode配置在线更新
datanode 的配置可以在线更新了,http://blog.cloudera.com/blog/2015/05/new-in-cdh-5-4-how-swapping-of-hdfs-datano ...
- [转]ion-slide-box
本文转自:http://ionicframework.com/docs/api/directive/ionSlideBox/ The Slide Box is a multi-page contain ...
- 编译Ansj之Solr插件
Ansj是一个比较优秀的中文分词组件,具体情况就不在本文介绍了.ansj作者在其官方代码中,提供了对lucene接口的支持.如果用在Solr下,还需要简单的扩展一下. 1.基于maven管理 ansj ...
- pyenv 使用简介
pyenv 是一个 python 版本管理工具,可以方便用户在不同的 python 版本间切换,例如我的电脑里默认的 python 是 2.6, 但我还想装 2.7 3.5 等.另有一个名为 pyen ...
- Hibernate批量处理数据、HQL连接查询
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 ...
- ubuntu在命令行新建用户后无法进入桌面的原因
在命名行模式下 用useradd新建一个用户后 在图形界面输入密码无法登陆 这是因为未对新建的用户进行任何配置 用adduser命令新建用户即可进入桌面 下面说一下useradd 和 adduser的 ...
- 转:windows下命令行工具
转自: http://www.cnblogs.com/haochuang/p/5593411.html Windows下CMD不好用,远没有Linux,或者一些SSH工具用起来方便.其实Windows ...