Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 四大組件之ContentProvider(一)-使用系統提供的ContentProvider

四大組件之ContentProvider(一)-使用系統提供的ContentProvider

編輯:關於Android編程

第1節 ContentProvider介紹

ContentProvider是安卓系統的四大組件之一,可以向其他組件提供數據訪問的能力。它就像是一個網站,其他組件(或者其他應用)可以通過“網址”訪問它,獲取需要的信息。因此它可以作為不同應用之間共享數據的一種方式。

\

1.1 基礎功能

我們操作一個應用的數據,無外乎四種操作方式,

增:添加新的數據; 刪:刪除已有的數據; 改:修改已經的數據; 查:查詢已有的數據;

所以一個ContentProvider要對外提供這四種最基礎的功能至少一種。

1.2 操作的對象

對數據的操作范圍無外乎,

單條數據的操作:每一次操作增加一條數據,刪除一條數據,修改一條數據,查詢特定一條數據的詳細內容; 多條數據的操作:每一次操作增加多條數據,刪除多條數據,修改多條數據,查詢符合某個特征的多條數據;

例如,我們可能會向書架上“一次放一本書”-單條增,“一次取下一本書”-單條刪,“一次問書架上有多少書”-多條查。

因此,仿照網站地址的設計方式,我們可以用如下的“網絡地址”來表達我們希望進行的操作是針對單一一條數據還是同時多條數據:

xxx.xxx.xxx/items/1:針對單一一條數據,最後的數字代表特定一本書的編號(也可以使用書的名字來代替); xxx.xxx.xxx/items:針對多條數據;

“網站”只要看到以上的格式就知道,要操作的是一條數據還是多條數據了。

每個ContentProvider就是一個“網站”,每個網站都有自己的“網址”。安卓系統為這個“網址”設計了如下的結構,

scheme://authority/path
scheme:固定為“content”,相當於一個網址的“http”; authority:由開發者自己確定,通常把它寫成這個ContentProvider的包名,例如“com.anddle.mycontentprovider”,它就相當於網址的地址“www.google.com”; path:根據查詢內容的邏輯,由開發者自己決定,通常要分成多條數據和單一數據兩類;

典型的例子就像這樣,

多條數據
content://com.anddle.mycontentprovider/items

單一數據
content://com.anddle.mycontentprovider/items/1

這裡面,
scheme:“content”
authority:“com.anddle.mycontentprovider”
path:“items”或者“items/1”

只要定義好了前面兩種原則,外界(其他組件或者其他應用)就可以獲取到ContentProvider中的內容了。

第2節 使用ContentProvider

安卓系統上,提供了很多系統級的ContentProvider,我們可以直接使用。例如,

Media Provider:用來查詢磁盤上多媒體文件; Contacts Provider:用來查詢聯系人信息; Calendar Provider:用來提供日歷相關信息的查詢; Bookmark Provider:用來提供書簽信息的查詢;

它們的用法大同小異,只要使用它們對應的Uri地址就可以進行增刪改查的操作了。

這裡我們就用Media Provider來講解。

2.1 MediaProvider

Media Provider作為系統級別的應用程序在系統上運行,專門負責收集多媒體文件(音頻、視頻、文件)相關的信息。

Media Provider在開機啟動後,會在後台“監聽”磁盤上文件的變化,特定情況下,會自動更新多媒體文件的信息,例如磁盤上是否增加了媒體文件,是否被刪除了媒體文件,有的媒體文件名稱是否發生了修改等等。

所以當任何應用想獲取這類文件相關的信息時,就可以向Media Provider發起查詢的請求。Media Provider幫我們完成了視頻文件信息的收集,因此,當我們要查詢磁盤上的多媒體信息時,就不用自己去遍歷磁盤上的文件進行視頻文件的收集和整理了。

2.2 Media Provider查詢視頻文件

確定向Media Provider發出查詢請求的地址-uri,我們要查詢的視頻文件都是存放在外部存儲地址上的,就使用指向外部存儲的uri;

//uri就是:content://media/external/video/media"
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

確定要請求的視頻文件信息。我們需要查詢視頻的標題、創建時間,還需要播放它時使用的文件所在地址。這些信息在Media Provider中都對應著查詢它們使用的字段名稱;

String[] searchKey = new String[] {
MediaStore.Video.Media.TITLE, -->對應文件的標題
MediaStore.Images.Media.DATA, -->對應文件的存放位置
MediaStore.Images.Media.DATE_ADDED -->對應文件的創建時間
};

確定查詢的條件。這個條件參數的寫法就和SQL數據庫語言的語法一樣。這裡我們不打算講SQL語法,需要各位自己去學習了;設置成空,表示查詢所有數據項,

String where = null;

設定查詢結果的排序方式,使用默認的排序方式就可以了,

String sortOrder = MediaStore.Video.Media.DEFAULT_SORT_ORDER;

獲取ContentResolver對象,讓它使用前面的參數向Media Provider發起查詢請求;查詢的結果存放在Cursor--指標當中;

ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(
                uri,
                searchKey, 
                where, 
                null, 
                sortOrder);

遍歷Cursor,得到它指向的每一條查詢到的信息;當Cursor指向某條數據的時候,我們就獲取它攜帶的每個字段的值;

while(cursor.moveToNext())
{
    String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
    String name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
    String createdTime = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));
    ......  
}

Cursor使用完了之後要把它關閉掉,

cursor.close();

整理一下前面的各個步驟,獲取外部存儲上的視頻資源,方式如下,

Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

String[] searchKey = new String[] {
    MediaStore.Video.Media.TITLE,
    MediaStore.Images.Media.DATA,
    MediaStore.Images.Media.DATE_ADDED
};
String [] keywords = null;
String where = null;
String sortOrder = MediaStore.Video.Media.DEFAULT_SORT_ORDER;

ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(
                    uri,
                    searchKey, 
                    where, 
                    keywords, 
                    sortOrder);

if(cursor != null)
{
    while(cursor.moveToNext())
    {
        String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
        String name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));

        String createdTime = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));

        ......  
    }

    cursor.close();
}

最後一點千萬不要忘記,因為視頻文件存放在外部存儲器中,所以要在應用的AndroidManifest.xml文件中,添加讀取外部存儲器的權限,



    
    ......

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved