关于contentProvider和ContentResolver的个人理解

来源:互联网 发布:财务管理app软件 编辑:程序博客网 时间:2024/05/04 16:49

Android  ContentProvider和ContentResolve


一、前言                                                                                    

        在Android平台中,各个Android 应用中可能需要互相传递数据。而ContentProvider类的作用就是在不同的应用之间进行数据的传递。Android中可以通过SQLiteDataBase、文件来进行数据的存储,其他应用可以通过这些存储或者通过SharePreferences去操作另外一个应用中的数据。但是有些资料中说这些会有严重的安全漏洞,至于是什么漏洞不清楚,个人只是觉得使用ContentProvider简单不是那么麻烦。


二、URI简介                                                                               

       URI在AndroidContentProvider中很重要,URI类似于网络中的URL,是一条字符串用于保存信息,或保存信息的地址。
   对于一个URI:
  content://com.milkz.providers.mytest/messages
Uri uri = Uri.parse(content://com.milkz.providers.mytest/messages);

content://    <----   Android中规定的部分书写,类似于URL中的HTTP
com.milkz.providers.mytest <------ 该部分为AndroidContentProvider的authorities。继承自ContentProvider的
类的包的路径。
messages <------ 访问的数据

三、ContentProvider简介                                                         

       ContentProvider需要自定义一个Class去继承(有的公司API可能会把ContentProvider改成一个abstract,此时就需要使用者灵活改变了),假设这个自定义的类名为myContentProvider,这个定义的类的作用就是为了向其他应用提供信息的类。类似于给BroadCastReciver发送广播通知的系统广播,myContentProvider就是向外散发一个信息,然后对它感兴趣的类会去获取这个信息。ContentProvider向外发送的信息主要通过URI来发送,将一些信息封装在URI中,发送出去。
       继承于ContentProvider的类需要重写(有的公司的API修改了Google原生代码,可能就是实现接口了)

【ContentProvider中的六个方法】

        boolean onCreate()
和activity、service一样,ContentProvider也需要一个onCreate()来对数据进行初始化,但是在该方法中,同样不可进行大量的逻辑运算,防止造成线程阻塞。但是onCreate只会启动一次。该方法会在ContentProvider创建的时候被调用,当其他应用第一次访问时,ContentProvider会被创建并且会调用该方法。
        public Uri insert(Uri uri,ContentValues values) 
uri:消息封装的uri
values:该URI对应的值
用于向URI中插入消息
        public int delete (Uri uri,String selection,String[] selectionArgs)
删除某条消息
public int update(Uri uri,ContentValues values,String selection,Stringp[] selectionArgs)
更新消息
        public Cursor query(Uri uri,String[] projection ,String selectiion,String[] selectionArgs,String sortOrder)
类似于对数据库的操作,使用游标对数据进行一系列操作。通过获取游标来读取URI中的内容
        public String getType(Uri uri)
返回当前uri所代表的数据MIME类型。
字符串以 vnd.android.cursor.dir/ 开头: 该URI包含多条记录
字符串以 vnd.android.cursor.item/ 开头: 该URI只包含一条记录

四、ContentResolver                                                              

       ContentProvider是发送URI,对应的ContentResolver是用来接收信息并进行处理的,相比之下,ContentResolver并不需要太多的操作,直接在Content中使用getContentResolver() 来获取默认的ContentResolver对象。
         该对象直接操作URI对应的ContentProvider中的方法,故它属于单例模式。一个Android源码中有大量的COntentProvider和ContentResolver,而URI就是连接对应的Provider和Resolver的利器。


五、在Androidmanifest中配置                                                

<provider
android:name=".myProvider"    <-----   类的名字
android:authorities="com.milkz.mYprovider"     <------ 类的包名
android:
android:exported="true" />     <-----   该ContentProvider是否可以被其他应用调用。


六、URI工具类                                                                      

1)UriMatcher <-----  判断该URI能否被当前的ContentProvider处理

void addURI(String authority,String path,int code)   
向URI中添加内容,也可以理解为注册URI,一个URI可以包含多个记录
authority+path = URI
  code : 标识码
int match(Uri uri)
返回URI匹配的标识码,如果找不到则返回-1
使用:
String s = content://com.milkz.providers.mytest/messages;
UriMatcher matcher = new uriMatcher(UriMatcher.NO_MATCH);
matcher.addURI(s,message,1);
int a = matcher.match(Uri.parce(s)); // a =1
matcher.addURI(s,message/#,1);//此处#代表任意的标识码
int b = matcher.match(Uri.parce(s/1));//b = 1


2) ContentUris <-----  操作Uri字符串的工具类

withAppendedld(URI uri,int id)
为uri加上id,即标识码
parseId(URI uri) 
从指定的uri中解析出id



注:本文纯手打,文中有不对之处,请指出,谢谢。
博主原创,转载请标明出处,谢谢。