Android学习之ContentProvider总结

来源:互联网 发布:shell脚本编程诀窍 编辑:程序博客网 时间:2024/05/18 00:17

 在使用ContentProvider进行数据操作的时候(insert() update() query() delete()),都是采用了URI的形式进行数据的操作


    如: content://com.kingowe.membercontentprovider/member/3
              <A部分>                     <B部分>                               <C部分>


· A部分(协议):ContentProvider(内容提供者)访问协议,已经由Android所规定为:content://; 

· B部分(主机名或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它

一般都为程序的“包.类”名称,但是要采用小写字母的形式表示; 


· C部分(Path):访问的路径,一般都为要操作的数据表的名称,根据操作的不同可以如以下几种情况: 


· 访问全部数据:content://Authority/Path 
         如: member表的全部数据:content://org.lxh.demo.membercontentprovider/member/ 

· 根据id访问数据:content://Authority/Path/ID 
         如:member表中id为3的数据:content://org.lxh.demo.membercontentprovider/member/3 

· 访问某一条记录的某个字段:content://访问标识/表名称/ID/列名称 
         如:member表第3条记录name数据:content://org.lxh.demo.membercontentprovider/member/10/name 

            ================以上部分选自李兴华老师<Android开发实战经典>===============


    由于通过 ContentProvider 来操作数据库需要牵扯到很多类,因此我总结了一下 

通过ContentProvider 操作数据库的大体结构、流程

 
操作流程:》
 

1.    定义一个类 CPInstance extends ContentProvider ,在 CPInstance 中通过重写 ContentProvider

中的抽象方法 来操作数据库,所以在 CPInstance 中就需要定义 SQLiteOpenHelper、SQLiteDatabase,

在重写的方法中 通过 SQLiteOpenHelper对象 取得一个 SQLiteDatabase 的实例来操作数据库


2.    在 CPInstance 中定义 UriMatcher,在 static { } 中创建 UriMatcher 的实例,并且同时为 UriMatcher 实例

添加匹配规则:addURI(String authority, String path, int code)


3.    在其他需要访问数据库的类中,以 MainActivity 为例: 在 MainActivity 中定义一个 ContentResolver,通过 Activity

类的getContentResolver() 方法获得一个ContentResolver 对象resolver,通过 Uri.parse("content://authority/xxx")

解析地址得到一个 URI 实例 uri, 通过为 resolver.query()  resolver.delete() ...传入 uri 以及其他必要参数

来操作数据库 (这里实际是调用的 ContentProvider 中的对应的方法,在 ContentProvider中完成对数据表的操作)


4. 配置 CPInstance (AndroidManifest.xml)

     《AndroidManifest.xml 中 <application> 标签中添加的子标签 <provider>》

             <provider 
                 android:name="com.example.android.CPInstance"
                 android:authorities="com.packageName.personprovider">
                  <!-- 
                                                【说明:】
                     · android:name 属性值为 自己实现的 ContentProvider 子类 的全名(包名 + *.java)

                     · android:authorities 属性值为自定义值,一般为当前应用程序的包名 + .user-definedName

该属性的作用类似于网站的域名

                 -->
             </provider>




  <额外小知识>:由于ContentProvider是一个数据的操作标准,所以在ContentProvider定义的时候就

已经明确的提出了要求,只要是唯一的标识(ID),其字段必须定义为“_id” 



 本人为Android初学者,所以所发表的内容肯定会有不足之处,真心希望各位发现有不正确的内容时,留下您宝贵的意见!

非常 感谢!







0 0
原创粉丝点击