zoukankan      html  css  js  c++  java
  • Android学习笔记(十六) ContentProvider

    1、相关概念

    • ContentProvider:不同应用程序之间进行数据交换的标准API;程序“暴露”数据的方法。
    • ContentResolver:一个程序访问另一个程序被“暴露”的数据的方法。
    • Uri:Uri是ContentProvider和ContentResolver进行数据交换的标识。

    举例说明:一个CotentResolver想要从一个ContentProvider那里获取数据,必须先要找到这个ContentProvider,找到的方法就是通过Uri这个参数,因为每一个Uri都有一个对应的ContentProvider。然后这个ContentResolver向Uri执行CRUD等操作,这个Uri再将这些CRUD操作委托给ContentProvider执行。

    2、开发和配置ContentProvider

    开发ContentProvider的具体过程较为复杂。因为开发时大多时候用Android自带的ContentProvider,所以这里仅作大概了解。

    开发一个ContentProvider,需要先构造一个继承ContentProvider的子类,然后再在AndroidManifext.xml文件中注册。

    2.1 继承ContentProvider

    需要重写以下方法:

    • public Cursor query(Uri uri, String[] projection, String where, String whereArgs, String sortOrder)
    • public Uri insert(Uri uri, ContentValues values)
    • public int update(Uri uri, ContentValues values String where, String whereArgs)
    • public int delete(Uri uri, String where, String[] whereArgs)
    • public boolean onCreate()
    • public String getType()

    2.2 配置ContentProvider

    在<application…/>标签里加入:

    < provider
        android:name=".MyProvider"
        android:authorities="com.providers.myprovider"
        android:exported="true"/>

    其中,name指定该ContentProvider的实现类的类名;

    authorities指定该ContentProvider对应的Uri(相当于为该ContentProvider分配一个域名);

    exported指定该ContentProvider是否允许被其他应用调用。

    3、使用ContentResolver调用方法

    Context提供了getContentResolver()方法,因此Activity、Service等组件都可以通过getContentResolver()方法获取ContentResolver对象。

    public class MainActivity extends Activity{
        ContentResolver contentResolver;
        Uri uri = Uri.parse("content://com.providers.myprovider/");
        
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //获取系统的ContentResolver对象
            ContentResolver = getContentResolver();
        }
        public void query(View source){
            //调用ContentResolver的query()方法
            //实际返回的是该Uri对应的ContentProvider的query()的返回值
            Cursor cursor = contentResolver.query(uri,null,"query_where",null,null);
            Toast.makeText(this,"远程ContentResolver返回的Cursor为:"+cursor,Toast.LENGTH_SHORT).show();
        }
        public void insert(View source){
            ContentValues values = new ContentValues();
            Values.put("name","fkjava");
            //调用ContentResolver的insert()方法
            //实际返回的是该Uri对应的ContentProvider的insert()的返回值
            Uri newUri = contentResolver.insert(uri,values);
            Toast.makeText(this,"远程ContentResolver新插入的记录的Uri为:"+newUri,Toast.LENGTH_SHORT).show();
        }
        public void update(View source){
            ContentValues values = new  ContentValues();
            values.put("name","fkjava");
            //调用ContentResolver的update()方法
            //实际返回的是该Uri对应的ContentProvider的update()的返回值
            int count = contentResolver.update(uri, values, "update_where", null);
            Toast.makeText(this,"远程ContentResolver更新记录数为:"+count,Toast.LENGTH_SHORT).show();
        }
        public void delete(View source){
            //调用ContentResolver的delete()方法
            //实际返回的是该Uri对应的ContentProvider的delete()的返回值
            int count = contentResolver.delete(uri, "delete_where", null);
            Toast.makeText(this,"远程ContentResolver删除记录数为:"+count,Toast.LENGTH_SHORT).show();
        }
    }

    4、UriMatcher

    UriMatcher是方便对Uri进行操作的工具类,构造方法是:

    UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    该类包含两个方法:

    • void addURI(String authority, String path, int code)
    • int match(Uri uri)

    其中authority和path组合成一个Uri,code是该Uri对应的标识码(用于区分多个Uri)。match()方法返回的是该Uri对应的标识码。

    注:path中可以含有通配符“#”。假设某一个Uri的path为“word/#”,标识符为2,那么uriMatcher.match(Uri.parse(“content://com.providers.myprovider/word/10”))返回的值将会是2。

  • 相关阅读:
    Javascript函数式编程要掌握的知识点讲解
    任务
    怎么添加项目到SVN上面
    随便写一点最近开发遇到的问题和解决方法 大部分关于laravel和php
    laravel 将数组转化成字符串 再把字符串转化成数组
    laravel 配置了自己的域名以后, localhost 无法访问 404 not found 的解决方法
    实习日记15
    php接收post过来的 json数据 例子
    数据库如何让自增id重置
    C#连接MySQL数据库
  • 原文地址:https://www.cnblogs.com/viaduct/p/6431605.html
Copyright © 2011-2022 走看看