標籤:
在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:name="com.wuyudong.db.PersonDBProvider" android:authorities="com.wuyudong.db.personprovider" > </provider> </application></manifest>
Android 內容提供者簡介