ProAndroid学习笔记六 :了解ContentProvider中

ContentProvider的架构

Authority类似web中的域名,每个contentprovider会通过AndroidManifest.xml向系统注册authority,如下。其中name是类名,即如何找寻这个contentprovider。可以省去AndroidManifest.xml中packagename,不需要写完整的类名。如android:name=".BookProvider"。

<providerandroid:name="SomeProvider" android:authorities="com.your-company.SomeProvider"/>
<providerandroid:name="NotePadProvider"android:authorities="com.google.provider.NotePad"/>

和web的URL域名类似,content provider进行数据访问的URL为content://authority/......,例如content://com.your-company.SomeProvider/。对于Android自己提供的contentprovider,有时会写的比较简单,例如用contacts来代替com.google.android.contacts,如content://contacts/……。

有时注册的provider会比较复杂,例如Android的联系人信息,其uri为content://com.android.contacts/contacts,其源代码信息为如下,该provider需要读写权限。

<providerandroid:name="ContactsProvider2"
   android:authorities="contacts;com.android.contacts"
   android:label="@string/provider_label"
   android:multiprocess="false"
   android:readPermission="android.permission.READ_CONTACTS"
   android:writePermission="android.permission.WRITE_CONTACTS">
   <path-permission
           android:pathPrefix="/search_suggest_query"
           android:readPermission="android.permission.GLOBAL_SEARCH"/>
   <path-permission
           android:pathPrefix="/search_suggest_shortcut"
           android:readPermission="android.permission.GLOBAL_SEARCH"/>
   <path-permission
           android:pathPattern="/contacts/.*/photo"
           android:readPermission="android.permission.GLOBAL_SEARCH"/>
   <grant-uri-permissionandroid:pathPattern=".*"/>
</provider>

ContentURI的结构。Android通过ContentURI来获取数据,并返回具有行列结构的游标cursor。content UI的格式为:

content://<authority-name>/<path-segment1>/<path-segment2>/etc
例子:content://com.google.provider.NotePad/notes/23

例子的/notes表示collection,或理解为一个目录,称为pathsegment,而/23表示特定的item,是具体的index,contentprovider提供的是二维数据,这就是该row的_id值。

MIMEType。HTTP响应会带有MIMEType,最长江就是text/html,告知body的数据类型。ContentProvider也一样,可以用方法获得MIME。MIME由两部分组成:type/subtype,具体可以参考rfc2046。type和subtype的定义可以在IANA中查到。下面是MIME的几个例子:

text/xml
application/rtf
application/vnd.ms-excel  //vnd是vendeor-specific,厂家自定义格式,如此处的微软excel格式
application/x-tar               //x-表示自定义的私有格式

在ContentProvider中可以存在多层目录,即存在item和collection,相应地分别有item的MIMEtye和collection的MIMEtype。Android采用namespace的方式定义type和subtype。如下:

vnd.android.cursor.item/vnd.<yourcompanyname.contenttype>是item的MIME type
vnd.android.cursor.dir/vnd.<yourcompanyname.contenttype>是collection的MIMEtype

从上面的格式可以看到,type已指定,开发者只能对subtype进行设置。

定义清晰描述。我们应该为所创建的contentprovider提供清晰的定义或描述,可通过所使用的Uri进行constant的预定义。例如MediaStore.Images.Media.INTERNETAL_CONTENT_URI表示content://media/internal/images。同时我们也应为个列

小例子:读取联系人信息。Provider通过uri去访问,返回游标(cursor),我们将通过下面的小例子进行验证,先进行Uri的了解,然后对cursor进行二次轮询,一次采用while,一次采用for方式。正如前面的contactprovider在xml的定义所示,有读写权限限制,因此在XML中应赋予相应的权限:<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>

    privatevoid contentProviderTest(){
       
       String[] contactProjection = new String[]{
               Contacts._ID,   
               Contacts.DISPLAY_NAME_PRIMARY
       };       

       
       Uri peopleBaseUri = ContactsContract.Contacts.CONTENT_URI;
       showInfo(peopleBaseUri.toString()); //showInfo()信息显示,我将在TextView中呈现内容
       Uri myPersonUri = Uri.withAppendedPath(peopleBaseUri,"1");
       showInfo(myPersonUri.toString()); 
        
       
       @SuppressWarnings("deprecation")//在API Level11,也就是Android3.0后由CursorLoader替代,为了不使Eclipse报警告,我们先在此禁止警告。看到Eclipse有个小三角的告警说明,觉得不舒服,干掉它。^_^
       Cursor cur =managedQuery(ContactsContract.Contacts.CONTENT_URI,
                               contactProjection,
                               null,
                               null,
                               null); 
      showInfo("query Contacts getcursor : " + cur);
      showInfo("cursor has" + cur.getCount() + "rows.");
       
       // 轮询方式一:  通过while
       showInfo("read fromcursor");
       //游标是rows的集合,首先需要使用moveToFirst(),因为query后游标是位于第一行的前面。返回false,表示为空。
       if(!cur.moveToFirst()){
           showInfo("no rows. It'sempty");
           cur.close();
           return;
       }
       
       //游标可以前后移动,去可以查看不同行的数据,还可以指定特定的行,它的移动非常灵活。游标对数据的获取是基于columnnumber,可通过列名来获取。 
       int nameColumnIndex =cur.getColumnIndex(Contacts.DISPLAY_NAME_PRIMARY); 
       showInfo("t Name: " +cur.getString(nameColumnIndex));
       while(cur.moveToNext()){ 
           showInfo("t Name:" +cur.getString(nameColumnIndex));
       }
       
       //轮询方式二:通过for 
       showInfo("read from cursoragain");
ProAndroid学习笔记(六):了解ContentProvider(中)
       for(cur.moveToFirst(); !cur.isAfterLast();cur.moveToNext()){
           String name = cur.getString(nameColumnIndex);
           showInfo("t Name: " +name);
       }
       
       cur.close();
    }

Where条件的用法。查找特定的数据,可以利用Uri,也可以利用manageQuery()方法的参数。例如希望查询select* from notes where _id=23,利用Uri,可以设置为

String noteUri =“content://com.google.progider.NotePad/notes/23”;

利用manageQuery()中的selection擦数,同样可以表达为

managedQuery(uri, //为"content://com.google.provider.NotePad/notes"
                         null, 
                         "_id=?" ,
                         new String[] {23}
                         null);

增加、修改、删除数据。增删改查是数据读写的四大功能,我们将在后面的小例子中给出详细的说明。

相关链接: 我的Android开发相关文章

  

爱华网本文地址 » http://www.aihuau.com/a/25101017/338623.html

更多阅读

伤寒学习笔记(下

伤寒学习笔记---14,桂枝用量问题?学习仲景药法,涉及用量问题。深入考证,固然不必,简单了解,实属必要。仅以桂枝为例,整理如下:基本资料:《现代中医药应用与研究大系》1985年版,简称《大系》。药法:凡例里说:“将其折合今之用量---,并结合笔者临床

汽车驾驶学习笔记之一:自动挡操作方法与步骤

一、方向盘的握法及交替 1)、方向盘的握法:小型车:按钟的刻度,左手握在9点,右手握在3点。把方向盘看成一个表盘,表的数字代表位置,正确的方向盘握法是左手9点,右手3点,也就是两只手对称地放在方向盘两侧(即水平两侧),拇指轻轻搭在方向盘内侧,多

转载 SPSS学习笔记之——生存分析的Cox回归模型比例风险模型

原文地址:SPSS学习笔记之——生存分析的Cox回归模型(比例风险模型)作者:王江源一、生存分析基本概念1、事件(Event)指研究中规定的生存研究的终点,在研究开始之前就已经制定好。根据研究性质的不同,事件可以是患者的死亡、疾病的复发、仪器

Tinyos学习笔记2

Tinyos学习笔记(2)--ADC的使用前言这次的主要工作时搞清楚tinyos在CC2430平台下对ADC的操作。在CC2430下的ADC的工作方式主要有两种:一种为正常模式(包括轮询和中断);另外一种为DMA采集模式。在相应的tinyos实现中主要由AdcP module和A

RED5学习笔记二 :RED5项目配置

RED5学习笔记(二):RED5项目配置服务器端:red5的项目的建立与tomact非常的相似.1、在 Red5的安装路径C:Program FilesRed5webapps下建立自己的项目文件夹:  2、将C:Program FilesRed5docemplatesmyapp下的文件夹WEB-INF复制到自己的项

声明:《ProAndroid学习笔记六 :了解ContentProvider中》为网友未来不是梦分享!如侵犯到您的合法权益请联系我们删除