Provider端

public class PersonProvider extends ContentProvider {

    //用来存放所有合法的Uri的容器
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    //保存一些合法的uri
    // content://com.atguigu.l09_provider.personprovider/person 不根据id操作
    // content://com.atguigu.l09_provider.personprovider/person/3 根据id操作
    static {
        matcher.addURI("com.atguigu.l09_provider.personprovider", "/person", 1);
        matcher.addURI("com.atguigu.l09_provider.personprovider", "/person/#", 2);  //#匹配任意数字
    }
    private DBHelper dbHelper;
    public PersonProvider() {
        Log.e("TAG", "PersonProvider()");
    }
    @Override
    public boolean onCreate() {
        Log.e("TAG", "PersonProvider onCreate()");
        dbHelper = new DBHelper(getContext());

        return false;
    }

    /**
     * content://com.atguigu.l09_provider.personprovider/person 不根据id查询
     * content://com.atguigu.l09_provider.personprovider/person/3 根据id查询
     */
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        Log.e("TAG", "PersonProvider query()");

        //得到连接对象
        SQLiteDatabase database = dbHelper.getReadableDatabase();

        //1.匹配uri, 返回code
        int code = matcher.match(uri);
        //如果合法, 进行查询
        if(code==1) {//不根据id查询
            Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, null);
            return cursor;
        } else if(code==2) {//根据id查询
            //得到id
            long id = ContentUris.parseId(uri);
            //查询
            Cursor cursor = database.query("person", projection, "_id=?", new String[]{id+""}, null, null, null);
            return cursor;
        } else {//如果不合法, 抛出异常
            throw new RuntimeException("查询的uri不合法");
        }
    }

    /**
     * content://com.atguigu.l09_provider.personprovider/person 插入
     * content://com.atguigu.l09_provider.personprovider/person/3 根据id插入(没有)
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.e("TAG", "PersonProvider insert()");
        //得到连接对象
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        //匹配uri, 返回code
        int code = matcher.match(uri);
        //如果合法, 进行插入
        if(code==1) {
            long id = database.insert("person", null, values);
            //将id添加到uri中
            uri = ContentUris.withAppendedId(uri, id);
            database.close();
            return uri;
        } else {
            //如果不合法, 抛出异常
            database.close();
            throw new RuntimeException("插入的uri不合法");
        }
    }

    /**
     * content://com.atguigu.l09_provider.personprovider/person 不根据id删除
     * content://com.atguigu.l09_provider.personprovider/person/3 根据id删除
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.e("TAG", "PersonProvider delete()");
        //得到连接对象
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        //匹配uri, 返回code
        int code = matcher.match(uri);
        int deleteCount = -1;
        //如果合法, 进行删除
        if(code==1) {
            deleteCount = database.delete("person", selection, selectionArgs);
        } else if(code==2) {
            long id = ContentUris.parseId(uri);
            deleteCount = database.delete("person", "_id="+id, null);
        } else {
            //如果不合法, 抛出异常
            database.close();
            throw new RuntimeException("删除的uri不合法");
        }

        database.close();
        return deleteCount;
    }

    /**
     * content://com.atguigu.l09_provider.personprovider/person 不根据id更新
     * content://com.atguigu.l09_provider.personprovider/person/3 根据id更新
     */
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        Log.e("TAG", "PersonProvider update()");
        //得到连接对象
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        //匹配uri, 返回code
        int code = matcher.match(uri);
        int updateCount = -1;
        //如果合法, 进行更新
        if(code==1) {
            updateCount = database.update("person", values, selection, selectionArgs);
        } else if(code==2) {
            long id = ContentUris.parseId(uri);
            updateCount = database.update("person", values, "_id="+id, null);
        } else {
            //如果不合法, 抛出异常
            database.close();
            throw new RuntimeException("更新的uri不合法");
        }

        database.close();
        return updateCount;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }
}
  <provider android:name="com.atguigu.l09_provider.PersonProvider"
            android:authorities="com.atguigu.l09_provider.personprovider"
            android:exported="true"/>
        <!-- exported : 是否可以让其它应用访问 -->

Resolver端

/*
     * 通过ContentResolver调用ContentProvider插入一条记录
     */
    public void insert(View v) {
        //1. 得到ContentResolver对象
        ContentResolver resolver = getContentResolver();
        //2. 调用其insert
        Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
        //uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/3");
        ContentValues values = new ContentValues();
        values.put("name", "JACK");
        uri = resolver.insert(uri, values);

        Toast.makeText(this, uri.toString(), 1).show();
    }

    /*
     * 通过ContentResolver调用ContentProvider更新一条记录
     */
    public void update(View v) {
        //1. 得到ContentResolver对象
        ContentResolver resolver = getContentResolver();
        //2. 执行update
        Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
        ContentValues values = new ContentValues();
        values.put("name", "JACK2");
        int updateCount = resolver.update(uri, values, null, null);

        Toast.makeText(this, "updateCount="+updateCount, 1).show();
    }

    /*
     * 通过ContentResolver调用ContentProvider删除一条记录
     */
    public void delete(View v) {
        //1. 得到ContentResolver对象
        ContentResolver resolver = getContentResolver();
        //2. 执行delete
        Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
        int deleteCount = resolver.delete(uri, null, null);
        Toast.makeText(this, "deleteCount="+deleteCount, 1).show();
    }

    /*
     * 通过ContentResolver调用ContentProvider查询所有记录
     */
    public void query(View v) {
        //1. 得到ContentResolver对象
        ContentResolver resolver = getContentResolver();
        //2. 调用其query, 得到cursor
        Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/1");
        uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
        Cursor cusor = resolver.query(uri, null, null, null, null);
        //3. 取出cursor中的数据, 并显示
        while(cusor.moveToNext()) {
            int id = cusor.getInt(0);
            String name = cusor.getString(1);
            Toast.makeText(this, id+" : "+name, 1).show();
        }
        cusor.close();
    }

contentprovider 实例的更多相关文章

  1. (Android) ContentProvider 实例

    ContentProvider 用于应用程序(Android Application)之间传递数据,包括Insert, update, delete, query. 下面的例子是在两个应用之间传递数据 ...

  2. 【Android】19.3 ContentProvider及安卓进一步封装后的相关类

    分类:C#.Android.VS2015: 创建日期:2016-03-08 一.简介 ContentProvider:内容提供程序. Android的ContentProvider与.NET框架的EF ...

  3. Android 进阶11:进程通信之 ContentProvider 内容提供者

    学习启舰大神,每篇文章写一句励志的话,与大家共勉. When you are content to be simply yourself and don't compare or compete, e ...

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

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

  5. Android ContentProvider 启动分析

    对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...

  6. Android开发-API指南-创建 Content Provider

    Creating a Content Provider 英文原文:http://developer.android.com/guide/topics/providers/content-provide ...

  7. 2.SDL规范文档

    01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...

  8. Android 技能图谱学习路线

    这里是在网上找到的一片Android学习路线,希望记录下来供以后学习 1Java 基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap ...

  9. ActivityThread 源码分析

    ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行) ...

随机推荐

  1. MySQL 几种调式分析利器

    目录 pstack gdb strace perf pstack 获取堆栈信息 问题线程的定位 负载较低 mysql_pid=4522 pstack $mysql_pid>pstack.info ...

  2. Arduino可穿戴教程保存源文件与打开已经存在的源文件

    Arduino可穿戴教程保存源文件与打开已经存在的源文件 Arduino IDE保存源文件 保存源文件可以通过“文件”菜单的“保存”或者快捷键Ctrl+S完成,如图2.28所示.   图2.28  保 ...

  3. man

    Description n间房子高度不同,Man 要从最矮的房子按照高度顺序跳到最高的房子,你知道房子的顺序,以及Man一次最远可以跳多远,相邻的房子至少有1的距离,房子的宽不计,现在由你安排相邻房子 ...

  4. kafka生产者客户端

    kafka的生产者 1. 生产者客户端开发 ​ 熟悉kafka的朋友都应该知道kafka客户端有新旧版本,老版本采用scala编写,新版本采用java编写.随着kafka版本的升级,旧版本客户端已经快 ...

  5. PriorityQueue ,ArrayList , 数组排序

    static class E implements Comparable<E>{ int x ; int y ; int state ; int money ; public E(int ...

  6. 数组全排列 knuth 分解质因数

    template<typename T> void swap(T* a, T* b) { T temp = *a; *a = *b; *b = temp; } //数组的全排列 void ...

  7. discuz X3.1+Apache2.2+php-5.2.17+mysql5.6.14+Discuz_X3.1

    discuz X3.1+Apache2.2.25+php-5.2.17+mysql5.6.14+Discuz_X3.1 一.准备 1.httpd-2.2.25-win32-x86-no_ssl.msi ...

  8. 最新ssh2构架

    构架要求: 1.最新ssh2jar包. 2.使用全注解. 3.给锁机制 4.缓存. 5.使用权限构架. 6. 前台构架用bootstraps. 今天任务: 搭建php环境.看代码.整理ssh2架构. ...

  9. vue2 + typescript2 自定义过滤器

    1.定义一个过滤器 // color-directive.ts import { DirectiveOptions } from 'vue' const directive: DirectiveOpt ...

  10. (一)MVVMLight安装

    http://www.cnblogs.com/manupstairs/p/4890300.html 1.首先新建一个wpf项目 2. 安装完成即可在我们的项目中看到如下引用: 如果点击安装的时候出现: ...