日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Content Provider之一大菊观

發(fā)布時(shí)間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Content Provider之一大菊观 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題記:這篇是對content provider的一個(gè)全局的認(rèn)識篇,包括一些基本概念和用法,故而借用下大酒神的大菊觀附體~

主要包括以下幾個(gè)方面:

  • provider執(zhí)行原理以及相關(guān)的概念;
  • 通過provider來存儲數(shù)據(jù);
  • provider的三大類型,以及不同的試用情況;
  • provider的工具類(contect class和mime類型)。

  content provider主要是用來支持跨應(yīng)用訪問數(shù)據(jù),如果只是本身應(yīng)用程序使用數(shù)據(jù),那么直接使用SQLiteDataBase就可以了。按我的理解是,content provider封裝了一些和android底層數(shù)據(jù)的操作,向外提供了統(tǒng)一的接口。contentResolver又是什么呢?按我的理解是,建立在很多具體的content provider基礎(chǔ)之上的一個(gè)工具類,同時(shí)封裝實(shí)現(xiàn)了content provider的那些數(shù)據(jù)訪問接口,統(tǒng)一了再上一層也就是客戶端的調(diào)用。這樣客戶端只需要一種調(diào)用方式,而不需要管調(diào)用的是哪個(gè)應(yīng)用的數(shù)據(jù),這些跨進(jìn)程的訪問細(xì)節(jié)都被contentResolver給屏蔽掉了。那么這時(shí)候客戶端調(diào)用數(shù)據(jù)需要有一個(gè)統(tǒng)一的調(diào)用方式,就是通過content URI來實(shí)現(xiàn)訪問。content URI規(guī)定了訪問數(shù)據(jù)的一個(gè)標(biāo)準(zhǔn)。同時(shí),若要訪問非數(shù)據(jù)庫一類的資源,也可以通過MIME類型的表示來訪問,只不過表現(xiàn)形式不一樣而已。

 一、provider執(zhí)行原理已經(jīng)相關(guān)概念

  實(shí)際上,訪問數(shù)據(jù)都是先通過contentResolver的相應(yīng)方法,如查詢時(shí),contentResolver.query()方法,實(shí)際上,其內(nèi)部調(diào)用的相關(guān)content provider的query()方法。一切需要通過content provider的操作,都可以通過contentResolver的相應(yīng)操作來實(shí)現(xiàn)。

  相關(guān)概念:

  • ?content URI:資源標(biāo)識符,用來訪問指定content Provider的指定資源。形式如下         
 content://schema/resource

?

   其中:content://為固定頭部,shema為具體的content provider標(biāo)識,resource為具體content provider提供的資源標(biāo)識,如表名words;

  • projection:查詢時(shí)需要顯示的列集合,為一字符串?dāng)?shù)組;
  • selection:查詢條件表達(dá)式字符串
  • selectionArgs:用來匹配查詢條件表達(dá)式中的?標(biāo)識符,使得查詢更加嚴(yán)謹(jǐn),主要是為了防止SQL注入等惡意輸入的情況;
  • sortOrder:排序條件,和sql查詢一樣的排序

  最終,其組合而成的還是一個(gè)SQL查詢語句,查詢到指定資源并返回。

? 二、provider存儲數(shù)據(jù)

  • 讀取數(shù)據(jù)。
    從content provider讀取數(shù)據(jù),首先需要相關(guān)被請求的content provider的讀取權(quán)限,并且相關(guān)權(quán)限需要在AndroidManifest.xml中的user-permission節(jié)點(diǎn)中聲明。
    組織查詢條件,定義好需要查詢的列集合,查詢條件等。query方法返回的是cursor對象,也稱游標(biāo)。若cursor為null或者query方法直接拋出異常,則表示query方法執(zhí)行時(shí)異常;正常cursor不為空,其cursor.getCount()方法返回值大于等于0的。cursor對象可以自由的訪問其包含的行和列對象,同時(shí)返回的數(shù)據(jù)類型不超過其支持的那幾種:int ,long,float,double,blob。cursor能夠根據(jù)查詢目標(biāo)更新而自動更新。
    展示Cursor中的查詢結(jié)果包括兩種方式:
    ? ? 一是直接將Cursor對象當(dāng)作參數(shù)傳遞到SimpleCursorAdapter對象中,展示在listView中。這時(shí)需要有_id一列。
    ? ? 二是直接讀取Cursor對象中的值:
    if (mCursor != null) {(mCursor.moveToNext()) {// Gets the value from the column.newWord = mCursor.getString(index);} } else {// Insert code here to report an error if the cursor is null or the provider threw an exception. }
  • 寫入數(shù)據(jù)。
    寫入包括以下三種類型的操作:
    a).insert。
    ? ? 通過ContentValues對象的put方法,將相應(yīng)字段的對應(yīng)值放入該對象中。若要放入空值,使用putNull。
    Uri mNewUri;...// Defines an object to contain the new values to insert ContentValues mNewValues = new ContentValues();/** Sets the values of each column and inserts the word. The arguments to the "put"* method are "column name" and "value"*/ mNewValues.put(UserDictionary.Words.APP_ID, "example.user"); mNewValues.put(UserDictionary.Words.LOCALE, "en_US"); mNewValues.put(UserDictionary.Words.WORD, "insert"); mNewValues.put(UserDictionary.Words.FREQUENCY, "100");mNewUri = getContentResolver().insert(UserDictionary.Word.CONTENT_URI, // the user dictionary content URImNewValues // the values to insert );

    ? ? 同時(shí)insert方法返回uri,指向新增加的一行,可以通過ContentUris.parseId(),獲取該URI中表示的ID。
    b).update。
    ? ? 通過ContentValues對象把要更新的字段寫入其中,contentResolver.update()方法返回的是已更新的行數(shù)。
    c).delete。
    ? ? contentResolver.delete()方法返回的是已刪除的行數(shù)。

  • 三、訪問Provider的三大方式

  • 批量訪問(batch access):通過ContentProviderOperation類型來創(chuàng)建批量操作,并且通過contentResolver.applyBatch()方法來實(shí)現(xiàn);
  • 通過intent來訪問,適用于沒有設(shè)定權(quán)限而又想訪問其他應(yīng)用的數(shù)據(jù)時(shí)。直接通過intent來訪問,然后根據(jù)返回的uri再來獲取對應(yīng)的值;
  • 異步加載數(shù)據(jù),常用的有CursorLoader。
  • 四、工具類

    • 工具類實(shí)際是用來標(biāo)識content provider所要控制的數(shù)據(jù)一個(gè)結(jié)構(gòu)描述,如某張表下有哪些列,基本content uri字符串是什么等一些能夠描述content provider里面的數(shù)據(jù)的。
    • content provider URI返回值也可以包括兩種MIME類型:標(biāo)準(zhǔn)的MIME和自定義的MIME。
      標(biāo)準(zhǔn)的MIME如:text/html,前面的是類型,后面的是子類型。
      自定義的MIME類型:
      vnd.android.cursor.dir 表示類型或者多行,而下面的表示一行或者一條數(shù)據(jù):
      vnd.android.cursor.item

      ?


      還是蠻有意思的,和正常的content uri對比,詳見SDK文檔。

    另外,本文中引用的代碼片段來自SDK官方學(xué)習(xí)文檔,轉(zhuǎn)載請說明出處~~

    轉(zhuǎn)載于:https://www.cnblogs.com/caiwan/archive/2013/01/30/2883456.html

    總結(jié)

    以上是生活随笔為你收集整理的Content Provider之一大菊观的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。