<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Android之Uri

    一、Uri的含義

    在Android中,為了使用數(shù)據(jù)集中管理模式,使用了ContentProvider來進行數(shù)據(jù)管理,在使用ContentProvider進行數(shù)據(jù)交互時就需要用到Uri。為了讓客戶端程序能夠使用你的數(shù)據(jù),你必須要定義一個公開的Uri,它由一些固定格式的文字組成,可以分成下面幾個部分:
    Android <wbr>- <wbr>Uri

      Android <wbr>- <wbr>Uri

     A: schema,表達的意思是使用ContentProvider來處理信息。

     B: authority,一個唯一的標識符。

     C: path,一般用來表示請求需要獲取的是哪種類型的數(shù)據(jù)(確定MIME類型的功能)。(

    MIME類型就是設(shè)定某種擴展名文件用一種應(yīng)用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應(yīng)用程序來打開。多用于指定一些客戶端自定義文件名,以及一些媒體文件打開方式。

     D: id,確定對應(yīng)類型的數(shù)據(jù)中的哪條記錄。

     

    schema

    一個標準的URI前綴,它用來指示Android必須從ContentProvider中挑出一個來處理這個URI。

    authority

    一個唯一的標識符,標示這個URI需要查找的ContentProvider是由哪個組織開發(fā)的,一般用跟java包命名規(guī)范相似的方式來署名這個開發(fā)組織。如果是Android內(nèi)置的provider,則這個authority可以省略掉,否則authority是必須的,Google建議使用用戶自定義的繼承ContentProvider的類的全名來作為這個ContentProvider所要處理的URI的authority。

    path

    ContentProvider根據(jù)這個路徑信息來判斷要返回什么類型的數(shù)據(jù),所以這個后綴路徑可以自由定義。如果一個ContentProvider能查詢返回很多種不同類型的數(shù)據(jù),URI后綴要設(shè)置不同類型的數(shù)據(jù)所對應(yīng)不同的URI后綴如內(nèi)置的Contact ContentProvider就是用來處理名片夾,它可以返回很多種類型的數(shù)據(jù):聯(lián)系人、電話、聯(lián)系方式等。所以對應(yīng)這些不同類型的數(shù)據(jù)就有不同的URI后綴匹配,而且我們要為不同的數(shù)據(jù)類型設(shè)置不同的MIME類型。

    id

    用于確定對應(yīng)類型或?qū)?yīng)路徑的數(shù)據(jù)中的哪條記錄。

     

    返回單條數(shù)據(jù):

    (1)content://contacts/people/1
       返回一個人員,MIME類型是:vnd.android.cursor.item/person。
    (2)content://contacts/people/1/phone/3
       返回一個電話號碼,MIME類型是:vnd.android.cursor.item/phone。

     

    返回多條數(shù)據(jù):

    同時ContentProvider不僅可以返回單條數(shù)據(jù),也可能以目錄的形式返回多條數(shù)據(jù)。以上面2個URI來說,后綴的結(jié)尾都是數(shù)字,這表示查詢對應(yīng)某條記錄,所以返回的數(shù)據(jù)是單條的,而如果是查詢目錄的形式就要去掉后面的數(shù)字如:

    (1)content://contacts/people/
       返回所有聯(lián)系人,MIME類型是:vnd.android.cursor.dir/person。
    (2)content://contacts/people/1/phone
       返回電話號碼,MIME類型是:vnd.android.cursor.dir/phone。

     

    路徑的構(gòu)建:

    路徑(path)的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定,如下:

    要操作person表中id為10的記錄,可以構(gòu)建這樣的路徑:/person/10

    要操作person表中id為10的記錄的name字段:person/10/name

    要操作person表中的所有記錄,可以構(gòu)建這樣的路徑:/person

    要操作xxx表中的記錄,可以構(gòu)建這樣的路徑:/xxx

     

    當然要操作的數(shù)據(jù)不一定來自數(shù)據(jù)庫,也可以是文件等他存儲方式,如下:

    要操作xml文件中person節(jié)點下的name節(jié)點,可以構(gòu)建這樣的路徑:/person/name

     

    如果要把一個字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法,如下:

    Uri uri = Uri.parse("content://cn.provider.personprovider/person")


    二、Uri的相關(guān)操作:

    因為Uri代表了要操作的數(shù)據(jù),所以我們很經(jīng)常需要解析Uri,并從Uri中獲取數(shù)據(jù)。Android系統(tǒng)提供了兩個用于操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便于我們的開發(fā)工作。

    UriMatcher

    UriMatcher類用于匹配Uri,它的用法如下:

    首先第一步,初始化:

     
    1. UriMatcher matcher new UriMatcher(UriMatcher.NO_MATCH);  

     第二步注冊需要的Uri:

     
    1. matcher.addURI("com.yfz.Lesson""people"PEOPLE);  
    2. matcher.addURI("com.yfz.Lesson""person/#"PEOPLE_ID);  

     第三部,與已經(jīng)注冊的Uri進行匹配:

     
    1. Uri uri Uri.parse("content://" "com.yfz.Lesson" "/people");  
    2. int match matcher.match(uri);  
    3. switch (match)  
    4.  
    5.     case PEOPLE:  
    6.         return "vnd.android.cursor.dir/people" 
    7.     case PEOPLE_ID:  
    8.         return "vnd.android.cursor.item/people" 
    9.    default 
    10.         return null 
    11.  

    match方法匹配后會返回一個匹配碼Code,即在使用注冊方法addURI時傳入的第三個參數(shù)。

    上述方法會返回"vnd.android.cursor.dir/person".

    總結(jié): 

    --addURI方法的第二個參數(shù)開始時不需要"/", 否則是無法匹配成功的。

    --常量 UriMatcher.NO_MATCH 表示不匹配任何路徑的返回碼

    --# 號為通配符

    --* 號為任意字符

     

    ContentUris

    ContentUris 類用于獲取Uri路徑后面的ID部分

    (1)為路徑加上ID: withAppendedId(uri, id)

     
    1. Uri uri Uri.parse("content://com.yfz.Lesson/people" 

    通過withAppendedId方法,為該Uri加上ID

     
    1. Uri resultUri ContentUris.withAppendedId(uri, 10);  

    最后resultUri為: content://com.yfz.Lesson/people/10

     

    (2)從路徑中獲取ID: parseId(uri)

     
    1. Uri uri Uri.parse("content://com.yfz.Lesson/people/10" 
    2. long personid ContentUris.parseId(uri);  

    最后personid 為 :10

    轉(zhuǎn)自:

     

    posted on 2011-10-07 19:31 灰色客棧 閱讀(2557) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2011年10月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品专区在线观看| 成年大片免费高清在线看黄| 亚洲色欲一区二区三区在线观看| 在线看免费观看AV深夜影院| 91福利免费网站在线观看| 亚洲夂夂婷婷色拍WW47| 久久精品国产亚洲av麻豆色欲| 亚洲一区二区精品视频| 午夜私人影院免费体验区| 1000部拍拍拍18勿入免费凤凰福利| 精品一区二区三区免费观看| 美女黄色免费网站| 亚洲老熟女五十路老熟女bbw | 免费看一级一级人妻片| 国产成人亚洲综合网站不卡| 亚洲码在线中文在线观看| 久久精品国产亚洲麻豆| 国产亚洲一区二区在线观看| 亚洲精品美女久久久久99小说| 国产大片91精品免费观看男同| 69成人免费视频无码专区| 91成人免费在线视频| 蜜桃AV无码免费看永久| 99热这里只有精品6免费| 美女在线视频观看影院免费天天看 | 人妻免费久久久久久久了| 无遮挡呻吟娇喘视频免费播放| 亚洲国产成人久久精品大牛影视 | 8x成人永久免费视频| 亚洲综合免费视频| 24小时免费看片| 日本免费一区二区在线观看| 在线日本高清免费不卡| 久久精品免费一区二区| 亚洲免费视频播放| 成人毛片免费观看| 精品少妇人妻AV免费久久洗澡| 免费看的黄色大片| 亚洲AⅤ无码一区二区三区在线| 午夜亚洲av永久无码精品| 亚洲国产午夜中文字幕精品黄网站|