Android跨程序共享數(shù)據(jù),探究內容提供器

《Android第一行代碼》

內容提供器簡介

內容提供器(Content Provider)主要用于在不同的應用程序之間實現(xiàn)數(shù)據(jù)共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數(shù)據(jù),同時還能夠保證被訪問數(shù)據(jù)的安全性。目前,使用內容提供器是Android實現(xiàn)擴平臺共享數(shù)據(jù)的標準方式。
不同文件儲存和SharedPreferences儲存中的兩種全局可讀寫操作模式,內容提供器可以選擇只對哪一部分數(shù)據(jù)進行共享,從而保證我們數(shù)據(jù)的安全性。
內容提供器主要有兩種操作,一種是利用現(xiàn)有的內容提供器來讀取和操作相應程序的數(shù)據(jù),另一種是創(chuàng)建自己的內容提供器提供給其他程序使用。接下來我讓我們學習這兩種操作,本次我們先學習利用現(xiàn)有的內容提供器來讀取和操作相應程序的數(shù)據(jù)的相應操作。

訪問其他程序中的數(shù)據(jù)

當一個程序通過內容提供器對其數(shù)據(jù)提供了外部訪問接口,任何其他程序就都可以對這部分數(shù)據(jù)進行訪問。Android系統(tǒng)自帶的電話簿、短信、媒體播放器等程序都提供了類似的訪問接口,這就使得第三方程序可以允許充分利用這部分的數(shù)據(jù)來實現(xiàn)更好的功能。接下來我們就來看看怎么使用這部分數(shù)據(jù)。

ContentResolver 的基本用法

要使用其他程序提供的數(shù)據(jù),就需要借助ContentResolver類,可以通過Context中的getContentResolver()方法獲取到該類實例。ContentResolver中提供了一系列方法用于對數(shù)據(jù)的CRUD(增刪改查)操作,其中insert()方法用于添加數(shù)據(jù),update()方法用于更新數(shù)據(jù),delete()方法用于刪除數(shù)據(jù),query()方法用于查詢數(shù)據(jù)。這種操作類似于SQLiteDataBase的操作,但不同于SQLiteDataBase的是,ContentResolver中的增刪改查操作不接收表明參數(shù),而是接收一個Uri參數(shù)。這個參數(shù)被稱為內容ERI。內容URI給內容提供器中的數(shù)據(jù)建立了唯一的標識,他主要是由兩部分組成,權限(authority)和路徑(path)。權限適用于對不同的應用程序作區(qū)分的,一般為了避免沖突,都會采用程序包名方式來進行命名。比如摸個程序的包名是com.example.app,那么該程序對應的權限就可以命名為 com.example.app.provider。路徑則是用于對同一個應用程序中不同的表作區(qū)分的。比如你的應用程序有兩張表table1、table2,那么內容URI就可以寫成com.example.app.provider/table1和com.example.app.provider/table2。不過這樣還不算是完整的內容URI,還需要加上我們的協(xié)議聲明:

content://com.example.app.provider/table1
content://com.example.app.provider/table2

這樣我們就表明了我們想訪問哪個程序里面的哪一個表。有了內容URI之后我們還需要把它解析成Uri對象,這樣我們就可以把Uri對象傳入。
解析的方法非常簡單,代碼如下:

Uri uri = Uri.parse("content://com.example.app.provider/table1"); 

現(xiàn)在我們就可以使用這個Uri對象來查詢table1中的數(shù)據(jù)了,代碼如下:

Cursor cursor = getContentResolver().qurey(
    uri,
    projection,
    selection,
    selectionArgs,
    sortOrder);

參數(shù)說明:

uri             指定查詢某個應用的某張表
projection      指定查詢的列名
selection       指定 where 的約束條件
selectionArgs   為 where 中的占位符提供具體的值
sortOrder       指定查詢的排列方式

查詢完成后返回一個Cursor對象,我們就可以將數(shù)據(jù)從Cursor對象中逐個讀取出來。讀取方式是通過移動游標的位置來遍歷Cursor的所有行,然后在取出每一行相應的數(shù)據(jù),代碼如下:

if(cursor!=null){
    while(cursor.moveToNext()){
        String colum1 = corsor.getString(cursor.getColumnIndex("column1"));
        int colum2 = corsor.getInt(cursor.getColumnIndex("column2"));
    }
    cursor.close();
}

掌握了最難的查詢,我們再來看看怎么在表內添加一條數(shù)據(jù):

ContentValues v = new ContentValues();
v.put("column1","newText");
v.put("column2",1);
getContentResolver().insert(uri,v);

可以看到,跟數(shù)據(jù)庫的操作一樣,我們依然是把數(shù)據(jù)封裝在 ContentVakues 中,然后調用ContentResolver的insert()方法,將 Uri 和 ContentVakues 作為參數(shù)傳入即可。

讓我們再來看看數(shù)據(jù)的更新:

ContentValues v = new ContentValues();
v.put("column1","newText2");
v.put("column2",111);
getContentResolver().update(uri, "column1 = ? and column2 = ?", new String[]{"newText","1"});

然后是刪除:

getContentResolver().delete(uri,"column2 = ?", new String[]{"1"});

以上就是ContentResolver對數(shù)據(jù)的增刪改查,看到這里相信好多人會期待最后會有一個具體的示例來鞏固剛才學到的知識,接下來我們就利用學到的知識來讀取手機電話簿的聯(lián)系人信系。

讀取手機聯(lián)系人信息

對于示例的UI界面我就不再多說了,相信大家都會。我寫一個方法來獲取手機聯(lián)系人的信息,把獲取到的聯(lián)系人信息通過return一個List返回給調用者,一共我們需要做三件事。

  • 新建一個聯(lián)系人的Modle來映射我們的聯(lián)系人信息
  • 在AndroidManifest.xml中添加訪問聯(lián)系人的權限(安卓版本6.0以下)
  • 編寫我們的方法
  1. 假設我們想要拿到聯(lián)系人的電話號和名稱,我們就可以寫這樣一個簡單的modle:
class Contact{
    private String name;
    private String num;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setNum(String num){
        this.num = num;
    }
    public String getNum(){
        return num;
    }
}
  1. 因為我們需要讀取手機聯(lián)系人信息,所以我們需要在Androidmanifest.xml中添加讀取聯(lián)系人信息的權限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
  1. 現(xiàn)在我們開始寫我們的方法,思路是這樣的:
    因為我們需要利用Context來get我們的ContentResolver實例,所以這個方法需要一個Context參數(shù),并且要有一個List返回值把我們拿到的信息返回給調用者。
public List<Contact> getContactDate(Context context){
    List<Contact> list = new ArrayList<>();
    Cursor c = null;
    c = context.getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,null,null,null);
    while(c.moveToNext){
        Contact con = new Contact();
        //添加聯(lián)系人姓名
        con.setName(c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
        //添加聯(lián)系人電話號
        con.setNum(c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NUMBER)));
        list.add(con);
    }
    return list;
}

到這里我們就把我們的工具方法寫好了,當我們需要獲取系人信息的時候,直接調用這個方法就能拿到手機電話簿中所有聯(lián)系人的姓名和電話了。

本篇到此結束。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容