Android入門篇(八)ContentProvider

這一篇記錄下安卓的組件之一ContentProvider,這個組件的主要做用有兩個,一個是經過該組件訪問其餘應用暴露出來的數據,另外一個做用就是將本身應用中的數據選擇性的暴露給其餘的應用。下面就講解一下該組件的一些基本概念,以及基本的使用方式。android

  • ContentProvider 概念詳解
    內容提供者將數據做爲一個或多個與關係數據庫中的表類似的表提供給外部應用程序。 行表明提供程序收集的某種類型數據的實例,行中的每一列表明針對實例收集的單個數據片斷。
    若是app須要將本身的數據共享出去,那麼就能夠在app中實現ContentProvider,同時註冊一個Uri,而後在其餘的應用中使用ContentResolver根據Uri取得app中的數據。
    上面提到了Uri,那麼什麼是Uri呢?
    在計算機術語中,統一資源標識符(Uniform Resource Identifier,或URI)是一個用於標識某一互聯網資源名稱的字符串。 該種標識容許用戶對任何(包括本地和互聯網)的資源經過特定的協議進行交互操做。URI由包括肯定語法和相關協議的方案所定義。
    URI的格式在Intent那一篇中介紹過了,這裏贅述一遍:
    URI的格式一般爲:scheme://host:port/path,參數的意義依次爲:協議頭,主機。端口,路徑。
  • ContentProvider 簡單使用sql

    • Query
      下面講解一下如何提取系統提供的一些數據,最經常使用的就是獲取系統中的聯繫人信息。
      須要注意的一點是,讀取聯繫人信息,須要添加權限:
      <uses-permission android:name="android.permission.READ_CONTACTS"/>數據庫

      private void getContacts(){
         ContentResolver resolver = getContentResolver();
         Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
         Cursor cursor = resolver.query(uri, null, null, null, null);
         assert cursor != null;
         while(cursor.moveToNext())
         {
             String cName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
             String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
             Log.d(TAG,"姓名:" + cName);
             Log.d(TAG,"號碼:" + cNum);
         }
         cursor.close();
        }

      上面這一段代碼,就是一個最基礎的用法,利用了resolver獲取數據。只是調用了query方法,這個方法的參數以下:app

      • @param uri The URI, using the content:// scheme, for the content to retrieve.
      • @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
      • @param selection A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given URI.
      • @param selectionArgs You may include ?s in selection, which will be replaced by the values from selectionArgs, in the order that they appear in the selection. The values will be bound as Strings.
      • @param sortOrder How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.
      • @return A Cursor object, which is positioned before the first entry, or null
      • @see Cursor
        這一段是安卓sdk中的註釋,uri是一個資源標識字符串;projection就是定義的數據庫中的列名,爲空時表明返回全部列;selection A就是至關於sql中的where語句(ps:學習安卓的開發是須要一些sql的知識的,這裏就不詳解了,有時間的話,我在把sql的基本用法記錄一下,方便本身的查閱,也爲初學者提供一些便利);selectionArgs 就是至關於selectionA中的佔位數據,selectionA中若是包含?佔位符,那麼佔位的數據就在這個地方填寫;sortOrder,顧名思義,就是表明了排序的語句,將取出的數據按照這個地方的規則進行排序。
    • Insert
      插入這一塊也利用聯繫人進行信息進行展現,一樣的須要添加一些權限控制, <uses-permission android:name="android.permission.WRITE_CONTACTS" />
      下面直接給出代碼:ide

      private void insertContact() throws RemoteException, OperationApplicationException {
           //使用事務添加聯繫人
           Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
           Uri dataUri = Uri.parse("content://com.android.contacts/data");
      
           ContentResolver resolver = getContentResolver();
           ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
           ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
                   .withValue("account_name", null)
                   .build();
           operations.add(op1);
      
           //依次是姓名,號碼,郵箱
           ContentProviderOperation op2 = ContentProviderOperation.newInsert(dataUri)
                   .withValueBackReference("raw_contact_id", 0)
                   .withValue("mimetype", "vnd.android.cursor.item/name")
                   .withValue("data2", "zorpan")
                   .build();
           operations.add(op2);
      
           ContentProviderOperation op3 = ContentProviderOperation.newInsert(dataUri)
                   .withValueBackReference("raw_contact_id", 0)
                   .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
                   .withValue("data1", "17806236835")
                   .withValue("data2", "2")
                   .build();
           operations.add(op3);
      
           ContentProviderOperation op4 = ContentProviderOperation.newInsert(dataUri)
                   .withValueBackReference("raw_contact_id", 0)
                   .withValue("mimetype", "vnd.android.cursor.item/email_v2")
                   .withValue("data1", "728606401@qq.com")
                   .withValue("data2", "2")
                   .build();
           operations.add(op4);
           //將上述內容添加到手機聯繫人中
           resolver.applyBatch("com.android.contacts", operations);
           Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_SHORT).show();
      
       }

      代碼就是這樣,很簡單,涉及到的就是一個數據類ContentProviderOperation ,這個類是用來存儲Content數據,具體的細節就很少說了,這個類在sdk能夠直接查看。每一個字段都有詳細的解釋。學習

相關文章
相關標籤/搜索