在Android應用中,我們可以使用顯式意圖(Explicit Intent)來直接訪問其他應用的Activity,但是這僅限於Activity的范疇;如果需要使用其他應用的數據,還需要用到另外一種組件,這就是所謂的內容提供者(Content Provider)。
1、內容提供者(Content Porviders)簡介
內容提供者主要用於在不同的應用程序之間實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數據,同時還能保證被訪數據的安全性。目前,使用內容提供者是Android實現跨程序共享數據的標准方式。
內容提供者的用法一般有兩種,一種是使用現有的內容提供者來讀取和操作相應程序中的數據,另一種是創建自己的內容提供者給我們程序的數據提供外部訪問接口。
官網定義:Content providers負責管理結構化數據的訪問,Contentproviders封裝數據並且提供一套定義數據安全的機制。Contentproviders是一套在不同進程間進行數據訪問的接口。Contentproviders為數據跨進程訪問提供了一套安全的訪問機制,對數據組織和安全訪問提供了可靠的保證。
每個Content Provider類都使用URI(Universal Resource Identifier,通用資源標識符)作為獨立的標識,格式如:content://com.example.app.provider/table1。其他應用程序通過不同的uri訪問不同的內容提供者,並獲取/操作里面的數據。
2、ContentProviders的作用?
Android通過ContentProvider來管理數據諸如音頻、視頻、圖片和通訊錄等。還可以通過ContentProvider來訪問SQLite數據庫等。
在以下情況下你需要使用ContentProviders:
- 你想為其他應用程序提供復雜數據或文件
- 你想允許用戶從你的應用程序中拷貝復雜數據到其他的應用中
- 你想使用搜索框架提供自定義的查詢建議功能
3、內容提供者方法介紹
(1)onCreate()
初始化內容提供者的時候調用。通常會在這里完成對數據庫的創建和升級等操作,返回true表示內容提供者初始化成功,返回false則表示失敗。注意,只有當存在ontentResolver嘗試訪問我們程序中的數據時,內容提供者才會被初始化。
(2)query()
從內容提供者中查詢數據。使用uri參數來確定查詢哪張表,projection參數用於確定查詢哪些列,selection和selectionArgs參數用於約束查詢哪些行,sortOrder參數用於對結果進行排序,查詢的結果存放在Cursor對象中返回。
(3)insert()
向內容提供者中添加一條數據。使用uri參數來確定要添加的表,待添加的數據保存在values參數中。添加完成后,返回一個用於表示這條新記錄的URI。
(4)update()
更新內容提供者中的數據。使用uri參數確定更新哪一張表中的數據,新數據保存在values參數中,selection和selectionArgs參數用於約束更新哪些行,受影響的行數將作為返回值返回。
(5)delete()
從內容提供者中刪除數據。使用uri參數來確定刪除哪一張表中的數據,selection和selectionArgs參數用於約束刪除哪些行,被刪除的行數作為返回值返回。
(6)getType()
根據傳入的內容URI來返回相應的MIME類型。
接下來實戰一下
接着《Android SQL語句實現數據庫的增刪改查》一文中的項目,在src\com\wuyudong\db目錄中新建PersonDBProvider,並且繼承自ContentProvider
PersonDBProvider.java中的代碼如下:
package com.wuyudong.db; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; public class PersonDBProvider extends ContentProvider { @Override public boolean onCreate() { // TODO Auto-generated method stub return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }
AndroidManifest.xml中添加下面代碼:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wuyudong.db" android:versionCode="1" android:versionName="1.0" > <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.wuyudong.db" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner" /> <activity android:name="com.wuyudong.db.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:exported="true" android:name="com.wuyudong.db.PersonDBProvider" android:authorities="com.wuyudong.db.personprovider" > </provider> </application> </manifest>