內容提供者,

來源:互聯網
上載者:User

內容提供者,
內容提供者

參考:

Android四大組件之內容提供者--ContentProvider - java小兵 - CSDN部落格
http://blog.csdn.net/wodewutai17quiet/article/details/46670597

Android四大組件之內容提供者--ContentProvider  

B程式通過內容提供者來訪問連絡人程式的資料。

 

1,什麼是ContentProvider  

        ContentProvider將應用中的資料對其它應用進行共用, 提供增刪改查的方法  

        ContentProvider統一了資料的訪問方式,不必針對不同資料類型採取不同的存取原則  

        ContentProvider將資料封裝,只暴露出我們希望提供給其它程式的資料  

        ContentProvider中可以註冊觀察者, 監聽資料的變化   

2,怎麼建立  

        2.1定義類繼承ContentProvider, 實現抽象方法,抽象方法中對資料庫操作的增刪改查都有。  

        2.2在資訊清單檔中註冊:在資訊清單檔的<application>節點下進行配置<provider>標籤,標籤中需要指定name和authorities屬性  

            name:完整的類名。可以省略包名(manifest節點的package值),注意:省略後的類名是以"."開頭的。  

            authorities:主機,是訪問Provider時的路徑,要唯一  

 

B程式需要通過com.baidu這個url來實現訪問修改讀取連絡人程式。

完整類名就是繼承ContentProvider類的那個類的完整類名。

這樣配置也是告訴電腦,我這個類是內容提供者,後面要被別人訪問,並且可以通過com.baidu這個主機訪問我。

我們在B程式中通過內容解析者和主機名稱訪問連絡人程式。

 

3,在手機上註冊
將應用安裝到手機上即可, 不用運行程式

4,其它應用怎麼訪問
外部應用使用ContentResolver類對ContentProvider中的資料進行訪問(CRUD操作)
擷取解析器ContentResolver
ContentResolver resolver = Context.getContentResolver();
通過resolver.insert(), delete(), update(), query()方法訪問Uri關聯的ContentProvider

 

 

5,Uri的處理
  URI代表要操作的資料,由scheme、authorites、path三部分組成
  eg:
    content://com.jxn.provider/person
    scheme | authorites | path

  1,schema:表明要訪問ContentProvider。固定為:"content://"
  2,Authority(主機名稱或授權):定義了是哪個ContentProvider提供這些資料。
  3,path:路徑,可根據商務邏輯自訂。eg: person、person/insert、person/insert/10等等
  4,ID:通常定義URI時使用"#"號預留位置代替, 使用時替換成對應的數字
    "content://com.jxn.provider/person/#" #表示資料id(#代表任一數字)
    "content://com.jxn.provider/person/*" *來匹配任意文本


  Android系統提供了兩個用於操作Uri的工具類:UriMatcher 和 ContentUris

  1,UriMatcher類用於匹配Uri,用法如下:

    第一步:把你需要匹配的Uri路徑全部給註冊上,如下:

      //常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼
      UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
      //如果match()方法匹配content://com.jxn.provider.personprovider/person路徑,返回匹配碼為1
      matcher.addURI("com.jxn.provider.personprovider", "person", 1);//添加需要匹配uri,如果匹配就會返回匹配碼
      //如果match()方法匹配content://com.jxn.provider.personprovider/person/230路徑,返回匹配碼為2
      matcher.addURI("com.jxn.provider.personprovider", "person/#", 2);//#號為萬用字元

    第二步:使用matcher.match(uri)方法對輸入的Uri進行匹配,如果匹配成功就返回匹配碼
      switch (matcher.match(Uri.parse("content://com.jxn.provider.personprovider/person/10"))) {
        case 1
        // 相應的業務操作
        break;
        case 2
        // 相應的業務操作
        break;
        default:
        // 相應的業務操作
        break;
        }

    2,ContentUris類用於為路徑加上ID和擷取路徑的ID

      給Uri加上id: ContentUris.withAppendedId(uri, id)
      擷取id: ContentUris.parseId(uri)

 

 

6,監聽內容提供者資料變化 

     

        1,如果ContentProvider的訪問者需要知道ContentProvider中的資料發生了變化,可以在ContentProvider 發生資料變化時調用getContentResolver().notifyChange(uri, null)來通知註冊在此URI上的訪問者,例如: 

            public class PersonContentProvider extends ContentProvider { 

                public Uri insert(Uri uri, ContentValues values) { 

                    db.insert("person", "personid", values); 

                    // 註:如果沒有調用notifyChange()方法,即使其它應用註冊了ContentObserver,也不會知道ContentProvider中的資料的變化 

                    getContext().getContentResolver().notifyChange(uri, null); 

                } 

            } 

             

        2,如果ContentProvider的訪問者需要得到資料變化通知,必須使用ContentObserver對資料(用uri描述)進行監聽,當監聽到資料變化通知時,系統就會調用ContentObserver的onChange()方法: 

            getContentResolver().registerContentObserver(Uri.parse("content://com.jxn.providers.personprovider/person"),true, new PersonObserver(new Handler())); 

            public class PersonObserver extends ContentObserver{ 

                public PersonObserver(Handler handler) { 

                    super(handler); 

                } 

                public void onChange(boolean selfChange) { 

                    //此處可以進行相應的業務處理 

                } 

            }  

 

7,補充 

        getType()方法:主要用於匹配資料類型,返回當前Uri所代表資料的MIME類型。 

            如果返回資料是單條資料:vnd.android.cursor.item  

            如果返回資料是多條資料:vnd.android.cursor.dir  

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.