Android連載37-跨程序共享數據

1、內容提供器

  • 使用內容提供器來共享數據
  • 能夠精確的進行控制,哪些數據能夠共享,哪些數據不能夠共享
  • 內容提供器有兩種用法:(1)使用現有的內容提供器來讀取和操做相應程序中的數據;(2)建立本身的內容提供器給咱們的程序的數據提供外部訪問接口

2、ContentResolver的基本用法

  • 獲取ContentResolver實例的方法: new Context().getContentResolver()
  • 該實例提供了一系列方法insert(),update(),delete(),query()用於CRUD操做
  • 這些成員方法在參數上與SQLiteDatabase實例有一些不一樣
  • 表名參數變成了Uri參數(內容URI)
  • URI有連部分組成:權限和路徑
  • 權限用於不一樣的程序來進行區分的,都採用程序包命名的方式,好比某個程序包爲 com.example.app那麼該程序對應的權限能夠命名爲 com.example.app.provide
  • 路徑則是用於對同一個應用程序中的不一樣的表進行區分的,一般會添加到權限後面,好比一個程序中含有兩個表table1和table2,那麼能夠將路徑分別命名爲/table1和/table2。而後進行兩者組合,內容Url變成了 com.example.app.provider/table1com.example.app.provider/table2
  • 還須要在頭部加上協議 content://com.example.app.provider/table1
  • 對於這個字符串咱們須要解析爲Uri對象才能做爲參數傳入
Uri uri = Uri.parse("content://com.example.app.provider/table1");
  • 查詢代碼以下
Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
  • 這些參數咱們作一個對比就一目瞭然了
query()方法參數 對應SQL部分 描述
uri from table_name 指定查詢某個應用程序下的某一張表
projection select colum1,column2 指定查詢的列名
selection where column = value 指定where的約束條件
selectionArgs 爲where中的佔位符提供具體的值
orderBy order by column1,column2 指定查詢結果的排序方式
  • 查詢後返回一個Cursor對象,接下來的咱們將數據從Cursor對象中逐個讀取出來,讀取的思路仍然是經過移動遊標的位置來進行遍歷Cursor的全部行,而後在取出每一行中相應列的數據
if(cursor != null ){
 while(cursor.moveToNext(){
  String column1 = cursor.getString(cursor.getColumnIndex("column1"));
  int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
 }
 cursor.close();
}
  • 剩下的增刪該就不難了
ContentValues values = new ContentValues();
values.put("column1","text");
values.put("column2","text");
getContentResolver().insert(uri,values);
  • 上面時插入數據,下面來一個更新數據
ContentValues values = new ContentValues();
values.put("column1","");
getContentResolver().update(uri,values,"column1 = ? and column2 = ?",new String[] {"text","1"});
  • 刪除數據
getContentResolver().delete(uri,"column2 = ?",new String[]{"1"});

3、源碼:

相關文章
相關標籤/搜索