ContentProvider是不同應用程式之間進行資料交換的API,ContentProvider以某種Uri的形式對外提供資料,允許其它應用通路或修改資料,其它的應用程式使用ContentResolver根據Uri去通路指定的ContentProvider提供的資料。
下面看一下内容提供者的使用步驟:
- 定義一個内容提供者: 定義一個類繼承ContentProvider,實作未實作的方法。
- 在清單檔案裡配置ContentProvider
- 定義一個uri的路徑比對器UriMatcher,在靜态代碼塊中添加比對規則
- 暴露需要暴露的增删改查方法
第一步:定義一個内容提供者: 定義一個類繼承ContentProvider,實作未實作的方法(這裡隻對其它應用程式暴露了查詢的方法,對應的uri為“content://com.study.myContentProvider/query”)
/**
* Created by 春水碧于天 on 2017/1/16.
*/
public class myContentProvider extends ContentProvider {
private static final int QUERYSUCCESS = ;
private SQLiteOpenHelper dbHelper;
//1.定義一個Uri的路徑比對器
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//2.建立一個靜态代碼塊,在這個裡面添加一個uri(類初次加載的時候執行)
static{
/**
* 添加一個Uri進行比對,傳回一個code
* authority:和清單檔案裡定義的authorities一樣
path:自定義路徑
code:
*
*/
sURIMatcher.addURI("com.study.myContentProvider","query",QUERYSUCCESS);
//可以添加多個Uri
}
/**
* 内容提供者初始化的時候執行
* @return
*/
@Override
public boolean onCreate() {
dbHelper = new MySQLiteOpenHelper(getContext()); //初始化一個資料庫的操作對象
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if(QUERYSUCCESS == sURIMatcher.match(uri)){ //進行路徑比對,根據傳回碼判斷是否需要執行的業務邏輯
//路徑比對成功
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}else{
Log.i("tag","沒有比對上……");
return null;
}
}
@Override
public String getType(Uri uri) { //用于傳回目前Uri所代表的資料的MIME類型
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) { //根據該Uri插入對應的資料
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {//根據該Uri删除對應的資料
return ;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {//根據該Uri更新對應的資料
return ;
}
}
-
在清單檔案裡配置ContentProvider
在application節點下進行如下配置
<provider
<!--authorities可随意填寫-->
android:authorities="com.study.myContentProvider"
android:name="com.example.studycontentprovider.myContentProvider"
<!--true表示允許其它應用通路-->
android:exported="true"
/>
這樣,一個内容提供者的例子就寫好了,一般來說ContentProvider是單例模式的,當多個應用程式通過ContentResolver來操作ContentProvider所提供的資料時,ContentResolver調用的資料操作會委托給同一個ContentProvider進行處理。
注:隻要是通過内容提供者暴露出來的資料,其通路的方式都是一樣的,就是通過内容解析者進行擷取應用程式通過内容提供者暴露出來的資料。
下面實作一個簡單的ContentResolver來擷取上面的ContentProvider所提供的資料:
ContentResolver擷取資料的核心代碼:
Uri uri = Uri.parse("content://com.study.myContentProvider/query");
Cursor cursor = getContentResolver().query(uri,new String[]{"name","money"},null,null,null);
while(cursor.moveToNext()){
String name = cursor.getString();
String money = cursor.getString();
Log.i("tag","Name:"+name+"Money:"+money);
}
cursor.close(); //使用完關閉遊标
Uri uri = Uri.parse(“content://com.study.myContentProvider/query”);
這裡的content://為協定名,固定寫法。
可以看到成功的通過内容提供者查詢到其它應用程式中私有的資料庫中的資料。