contentprovider 实例

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();
    }

 

转载于:https://www.cnblogs.com/znsongshu/p/9360299.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android ContentProvider是Android系统中的一个组件,用于管理应用程序之间的数据共享。它提供了一种标准的接口,使得应用程序可以访问其他应用程序的数据,同时也可以保护数据的安全性。ContentProvider可以将数据存储在文件系统、SQLite数据库或者网络上,然后通过URI来访问这些数据。开发者可以通过继承ContentProvider类来创建自己的ContentProvider,然后在AndroidManifest.xml文件中注册。在使用ContentProvider时,需要使用ContentResolver类来访问数据。 ### 回答2: Android ContentProvider是Android Framework中的一个重要组件,用于在应用间共享数据。它提供一种标准化的方式,让其它应用或组件访问原本受到封装的私有数据。ContentProvider采用标准的CRUD(Create、Retrieve、Update、Delete)逻辑来管理数据,且提供额外的查询功能,是实现数据在应用间共享的理想选择。 ContentProvider可以用来实现以下几个功能: 1. 数据共享:ContentProvider提供了一个标准的接口,让其它应用或组件来操作内容提供者的数据。 2. 数据访问保护:ContentProvider可以控制其它应用或组件只有在得到授权的情况下才能访问数据。 3. 储存树形数据:储存树形数据是很常见的需求,不像SQLite那样的关系型数据库。 4. 数据访问审计:作为应用中的一个中央存储库,ContentProvider可以记录其它应用或组件对它的操作记录。 下面以一个简单的例子来说明ContentProvider的使用过程: 1. 首先在AndroidManifest.xml文件中定义ContentProvider,必须在所有Activity的前面定义; 2. 在代码中继承ContentProvider,实现CRUD和查询方法; 3. 在应用中使用CursorLoader或ContentResolver访问ContentProvider中的数据; 4. 客户端进程和服务端进程都需要读写ContentProvider,为了防止多线程数据访问问题, ContentProvider通常会使用线程池来进行并发处理。 ContentProvider是Android组件中的一种,应用程序可以通过该组件来暴露自己的数据给其它应用程序使用,同时也可以访问其它应用程序的ContentProvider,以获取到这些应用程序所提供的数据。ContentProvider实例在Android开发中广泛运用。通过ContentProvider,我们可以更加方便地共享数据,能够让我们的应用程序变得更加灵活。 ### 回答3: Android提供了Content Provider框架,以便不同的应用程序之间共享数据。ContentProvider提供了一种安全访问数据的方式,防止数据被未经授权的访问。 实现Content Provider需要定义一个类,该类继承自ContentProvider类,并实现一些必要的方法,包括onCreate()、query()、insert()、update()和delete()。我们可以通过Content Resolver类来访问Content Provider,它是一个用于查询、插入、更新和删除数据的类。 Content Provider的最大好处是在应用程序之间共享数据。例如,一个应用程序可以提供联系人列表,并允许其他应用程序访问该列表。如果应用程序需要共享数据,可以使用Content Provider。 在实现Content Provider时,需要确定好URI的结构,以便其他应用程序访问数据。URI的结构可以根据应用程序的需求来定制。例如,我想创建一个共享书籍列表的Content Provider,URI可以定义为content://com.example.bookprovider/books。通过这个URI,其他应用程序可以访问该Provider中的books表,并操作数据。 要使用Content Provider,需要先在AndroidManifest.xml文件中注册该Provider。这需要声明一个<provider>标记,其中包含Provider的名称、权限和URI。 Content Provider在Android中被广泛使用,它可以让应用程序之间共享数据,并提高应用程序的安全性。但是,使用Content Provider也需要注意数据安全性,防止数据被未经授权的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值