作用:把一个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详解的更多相关文章

  1. Android开发数据存储之ContentProvider详解

    转载:十二.ContentProvider和Uri详解 一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可 ...

  2. 【转】android四大组件--ContentProvider详解

    一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...

  3. Android四大组件--ContentProvider详解(转)

    一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...

  4. Android面试收集录3 ContentProvider详解

    1.ContentProvider简单介绍 1.1.定义 ContentProvider,即内容提供者属于Android的四大组件之一. 1.2.作用 进程间进行数据交互&共享,即跨进程通信. ...

  5. Android ContentProvider详解

    1.概述 ContentProvider以Uri的形式对外提供数据,允许其他应用程序访问或者修改数据.也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过 ...

  6. ContentProvider数据访问详解

    ContentProvider数据访问详解 Android官方指出的数据存储方式总共有五种:Shared Preferences.网络存储.文件存储.外储存储.SQLite,这些存储方式一般都只是在一 ...

  7. Android ContentProvider 基本原理和使用详解

    ContentProvider(内容提供者)是 Android 的四大组件之一,管理 Android 以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他 ...

  8. Android proguard 详解

    本文转载于:http://blog.csdn.net/banketree/article/details/41928175 简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往 ...

  9. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

随机推荐

  1. 烂泥:NFS做存储与KVM集成

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前有关NFS的文章,我们介绍的都是NFS的使用挂载等等.这篇文章我们介绍有关NFS作为存储使用. 既然本篇文章的主题是有关NFS的,我们还是先把NFS ...

  2. ThreadPoolExecutor-线程池开发的使用

    好久没有写过笔记了,最近做的一个项目涉及打线程池和队列的开发,觉得在这个项目中学习到的还是挺多的,对线程安全,并发的知识有加深认知:当然,现在用过的东西并不是代表以后还能娴熟的使用,做好笔记非常重要: ...

  3. python 缩进语法,优缺点

    Python的语法比较简单——采用缩进方式 缩进有利有弊: 好处之一是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab.按照约定俗成的管理,应该始终坚持使用4个空格的缩进. 其二是强迫你写出 ...

  4. monkeyrunner之eclipse中运行monkeyrunner脚本之环境搭建(四)

    monkeyrunner脚本使用Python语法编写,但它实际上是通过Jython来解释执行. Jython是Python的Java实现,它将Python代码解释成Java虚拟机上的字节码并执行,这种 ...

  5. 详细说说 Google Test Certified 的各级——Level 2,3

    转载请联系作者,谢谢!   No releases with red tests基于Level1搭建的持续集成,持续发布选用的CL(changelist)就可以取自CI系统最后跑通的CL,因为持续集成 ...

  6. POJ1270 Following Orders[拓扑排序所有方案 Kahn]

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4885   Accepted: 1973 ...

  7. 第65课 C++中的异常处理(下)

    1. C++中的异常处理 (1)catch语句块可以抛出异常 ①catch中获捕的异常可以被重新抛出 ②抛出的异常需要外层的try-catch块来捕获 ③catch(…)块中抛异常的方法是throw; ...

  8. 线程同步以及yield()、wait()、Notify()、Notifyall()

    一.线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对 ...

  9. session跨域和ajax跨域名

    后台跨域和ajax跨域名: 后台跨域: www.baidu.com   主域名(一级域名一般以www开头) news.baidu.com   二级域名 (a.test.com和b.test.com有相 ...

  10. webclient 比浏览器加载页面慢的一个问题

    测试中发现webclient 比浏览器加载页面慢的一个问题:原因WebClient 支持 gzip, deflate,但是未设置 解决方案: class WebClientEx : WebClient ...