欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程之創(chuàng)建自己的內(nèi)容提供器實現(xiàn)方法

 更新時間:2017年08月01日 12:29:22   作者:dodo-yufan  
這篇文章主要介紹了Android編程之創(chuàng)建自己的內(nèi)容提供器實現(xiàn)方法,結(jié)合具體實例形式分析了Android創(chuàng)建內(nèi)容提供器的原理、步驟與相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了Android編程之創(chuàng)建自己的內(nèi)容提供器實現(xiàn)方法。分享給大家供大家參考,具體如下:

我們學(xué)習(xí)了如何在自己的程序中訪問其他應(yīng)用程序的數(shù)據(jù)??傮w來說思 路還是非常簡單的,只需要獲取到該應(yīng)用程序的內(nèi)容 URI,然后借助 ContentResolver 進行CRUD 操作就可以了??墒悄阌袥]有想過,那些提供外部訪問接口的應(yīng)用程序都是如何實現(xiàn)這種功能的呢?它們又是怎樣保證數(shù)據(jù)的安全性,使得隱私數(shù)據(jù)不會泄漏出去?

創(chuàng)建內(nèi)容提供器的步驟

前面已經(jīng)提到過,如果想要實現(xiàn)跨程序共享數(shù)據(jù)的功能,官方推薦的方式就是使用內(nèi)容提供器,可以通過新建一個類去繼承 ContentProvider 的方式來創(chuàng)建一個自己的內(nèi)容提供器。 ContentProvider 類中有六個抽象方法,我們在使用子類繼承它的時候,需要將這六個方法全 部重寫。新建 MyProvider 繼承自 ContentProvider,代碼如下所示:

public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
}

在這六個方法中,相信大多數(shù)你都已經(jīng)非常熟悉了,我再來簡單介紹一下吧。

1.    onCreate()

初始化內(nèi)容提供器的時候調(diào)用。通常會在這里完成對數(shù)據(jù)庫的創(chuàng)建和升級等操作, 返回 true 表示內(nèi)容提供器初始化成功,返回 false 則表示失敗。注意,只有當(dāng)存在 ContentResolver 嘗試訪問我們程序中的數(shù)據(jù)時,內(nèi)容提供器才會被初始化。

2.    query()

從內(nèi)容提供器中查詢數(shù)據(jù)。使用 uri 參數(shù)來確定查詢哪張表,projection 參數(shù)用于確 定查詢哪些列,selection 和 selectionArgs 參數(shù)用于約束查詢哪些行,sortOrder 參數(shù)用于 對結(jié)果進行排序,查詢的結(jié)果存放在 Cursor 對象中返回。

3.    insert()

向內(nèi)容提供器中添加一條數(shù)據(jù)。使用 uri 參數(shù)來確定要添加到的表,待添加的數(shù)據(jù) 保存在 values 參數(shù)中。添加完成后,返回一個用于表示這條新記錄的 URI。

4.    update()

更新內(nèi)容提供器中已有的數(shù)據(jù)。使用 uri 參數(shù)來確定更新哪一張表中的數(shù)據(jù),新數(shù) 據(jù)保存在 values 參數(shù)中,selection 和 selectionArgs 參數(shù)用于約束更新哪些行,受影響的 行數(shù)將作為返回值返回。

5.    delete()

從內(nèi)容提供器中刪除數(shù)據(jù)。使用 uri 參數(shù)來確定刪除哪一張表中的數(shù)據(jù),selection和 selectionArgs 參數(shù)用于約束刪除哪些行,被刪除的行數(shù)將作為返回值返回。

6.    getType()

根據(jù)傳入的內(nèi)容 URI 來返回相應(yīng)的 MIME 類型。 可以看到,幾乎每一個方法都會帶有 Uri 這個參數(shù),這個參數(shù)也正是調(diào)用 ContentResolver的增刪改查方法時傳遞過來的。而現(xiàn)在,我們需要對傳入的 Uri 參數(shù)進行解析,從中分析出 調(diào)用方期望訪問的表和數(shù)據(jù)。

回顧一下,一個標準的內(nèi)容 URI 寫法是這樣的:

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

這就表示調(diào)用方期望訪問的是 com.example.app 這個應(yīng)用的 table1 表中的數(shù)據(jù)。除此之 外,我們還可以在這個內(nèi)容 URI 的后面加上一個 id,如下所示:

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

這就表示調(diào)用方期望訪問的是 com.example.app 這個應(yīng)用的 table1 表中 id 為 1 的數(shù)據(jù)。 內(nèi)容 URI 的格式主要就只有以上兩種,以路徑結(jié)尾就表示期望訪問該表中所有的數(shù)據(jù),以 id 結(jié)尾就表示期望訪問該表中擁有相應(yīng) id 的數(shù)據(jù)。我們可以使用通配符的方式來分別匹 配這兩種格式的內(nèi)容 URI,規(guī)則如下。

1.    *:表示匹配任意長度的任意字符

2.    #:表示匹配任意長度的數(shù)字 所以,一個能夠匹配任意表的內(nèi)容 URI 格式就可以寫成:

content://com.example.app.provider/*

而一個能夠匹配 table1 表中任意一行數(shù)據(jù)的內(nèi)容 URI 格式就可以寫成:

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

接著,我們再借助 UriMatcher 這個類就可以輕松地實現(xiàn)匹配內(nèi)容 URI 的功能。UriMatcher 中提供了一個 addURI()方法,這個方法接收三個參數(shù),可以分別把權(quán)限、路徑和一個自定義 代碼傳進去。這樣,當(dāng)調(diào)用 UriMatcher 的 match()方法時,就可以將一個 Uri 對象傳入,返 回值是某個能夠匹配這個 Uri 對象所對應(yīng)的自定義代碼,利用這個代碼,我們就可以判斷出 調(diào)用方期望訪問的是哪張表中的數(shù)據(jù)了。修改 MyProvider 中的代碼,如下所示:

public class MyProvider extends ContentProvider {
public static final int TABLE1_DIR = 0;
public static final int TABLE1_ITEM = 1;
public static final int TABLE2_DIR = 2;
public static final int TABLE2_ITEM = 3;
private static UriMatcher uriMatcher; static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR);
uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM);
uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);
}
……
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
switch (uriMatcher.match(uri)) {
case TABLE1_DIR:
// 查詢table1表中的所有數(shù)據(jù)
break;
case TABLE1_ITEM:
// 查詢table1表中的單條數(shù)據(jù)
break;
case TABLE2_DIR:
// 查詢table2表中的所有數(shù)據(jù)
break;
case TABLE2_ITEM:
// 查詢table2表中的單條數(shù)據(jù)
break;
default:
break;
}
……
}
……
}

可以看到,MyProvider 中新增了四個整型常量,其中 TABLE1_DIR 表示訪問 table1 表 中的所有數(shù)據(jù),TABLE1_ITEM 表示訪問 table1 表中的單條數(shù)據(jù),TABLE2_DIR 表示訪問 table2 表中的所有數(shù)據(jù),TABLE2_ITEM 表示訪問 table2 表中的單條數(shù)據(jù)。接著在靜態(tài)代碼 塊里我們創(chuàng)建了 UriMatcher 的實例,并調(diào)用 addURI()方法,將期望匹配的內(nèi)容 URI 格式傳 遞進去,注意這里傳入的路徑參數(shù)是可以使用通配符的。然后當(dāng) query()方法被調(diào)用的時候, 就會通過 UriMatcher 的 match()方法對傳入的 Uri 對象進行匹配,如果發(fā)現(xiàn) UriMatcher 中某 個內(nèi)容 URI 格式成功匹配了該 Uri 對象,則會返回相應(yīng)的自定義代碼,然后我們就可以判斷 出調(diào)用方期望訪問的到底是什么數(shù)據(jù)了。

上述代碼只是以 query()方法為例做了個示范,其實 insert()、update()、delete()這幾個方 法的實現(xiàn)也是差不多的,它們都會攜帶 Uri 這個參數(shù),然后同樣利用 UriMatcher 的 match() 方法判斷出調(diào)用方期望訪問的是哪張表,再對該表中的數(shù)據(jù)進行相應(yīng)的操作就可以了。

除此之外,還有一個方法你會比較陌生,即 getType()方法。它是所有的內(nèi)容提供器都必 須提供的一個方法,用于獲取 Uri 對象所對應(yīng)的 MIME 類型。一個內(nèi)容 URI 所對應(yīng)的 MIME 字符串主要由三部分組分,Android 對這三個部分做了如下格式規(guī)定。

1.    必須以 vnd 開頭。
2.    如果內(nèi)容 URI 以路徑結(jié)尾,則后接 android.cursor.dir/,如果內(nèi)容 URI 以 id 結(jié)尾, 則后接 android.cursor.item/。
3.    最后接上 vnd.<authority>.<path>。
所以,對于 content://com.example.app.provider/table1 這個內(nèi)容 URI,它所對應(yīng)的 MIME

類型就可以寫成:

vnd.android.cursor.dir/vnd.com.example.app.provider.table1

對于 content://com.example.app.provider/table1/1 這個內(nèi)容 URI,它所對應(yīng)的 MIME 類型 就可以寫成:

vnd.android.cursor.item/vnd. com.example.app.provider.table1

現(xiàn)在我們可以繼續(xù)完善 MyProvider 中的內(nèi)容了,這次來實現(xiàn) getType()方法中的邏輯, 代碼如下所示:

public class MyProvider extends ContentProvider {
……
@Override
public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case TABLE1_DIR:
return "vnd.android.cursor.dir/vnd.com.example.app.provider.
table1";
case TABLE1_ITEM:
return "vnd.android.cursor.item/vnd.com.example.app.provider.
table1";
case TABLE2_DIR:
return "vnd.android.cursor.dir/vnd.com.example.app.provider.
table2";
case TABLE2_ITEM:
return "vnd.android.cursor.item/vnd.com.example.app.provider.
table2";
default:
break;
}
return null;
}
}

到這里,一個完整的內(nèi)容提供器就創(chuàng)建完成了,現(xiàn)在任何一個應(yīng)用程序都可以使用ContentResolver 來訪問我們程序中的數(shù)據(jù)。那么前面所提到的,如何才能保證隱私數(shù)據(jù)不會 泄漏出去呢?其實多虧了內(nèi)容提供器的良好機制,這個問題在不知不覺中已經(jīng)被解決了。因 為所有的 CRUD 操作都一定要匹配到相應(yīng)的內(nèi)容 URI 格式才能進行的,而我們當(dāng)然不可能 向 UriMatcher 中添加隱私數(shù)據(jù)的 URI,所以這部分數(shù)據(jù)根本無法被外部程序訪問到,安全問題也就不存在了。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android資源操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android文件操作技巧匯總》、《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android實現(xiàn)自動播放圖片功能

    Android實現(xiàn)自動播放圖片功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)自動播放圖片功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android應(yīng)用開發(fā)中模擬按下HOME鍵的效果(實現(xiàn)代碼)

    Android應(yīng)用開發(fā)中模擬按下HOME鍵的效果(實現(xiàn)代碼)

    Android應(yīng)用開發(fā)中, 有一種場景,就是我們不希望用戶直接按Back鍵退出Activity,而是希望應(yīng)用隱藏到后臺,類似于按Home鍵的效果
    2013-05-05
  • Android 關(guān)機彈出選擇菜單的深入解析

    Android 關(guān)機彈出選擇菜單的深入解析

    本篇文章是對Android 關(guān)機彈出選擇菜單進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Android 使用Zbar實現(xiàn)掃一掃功能

    Android 使用Zbar實現(xiàn)掃一掃功能

    這篇文章主要介紹了Android 使用Zbar實現(xiàn)掃一掃功能,本文用的是Zbar實現(xiàn)掃一掃,因為根據(jù)本人對兩個庫的使用比較,發(fā)現(xiàn)Zbar解碼比Zxing速度要快,實現(xiàn)方式也簡單,需要的朋友可以參考下
    2023-03-03
  • Android Studio升級到4.1以后插件問題解決

    Android Studio升級到4.1以后插件問題解決

    這篇文章主要介紹了Android Studio升級到4.1以后插件問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Android實現(xiàn)平滑翻動效果

    Android實現(xiàn)平滑翻動效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)平滑翻動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Android項目中引入aar包的正確方法介紹

    Android項目中引入aar包的正確方法介紹

    生成aar之后下一步就是如何引用本地的aar文件,下面這篇文章主要給大家介紹了關(guān)于Android項目中引入aar包的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Android開發(fā)之Parcel機制實例分析

    Android開發(fā)之Parcel機制實例分析

    這篇文章主要介紹了Android開發(fā)之Parcel機制,實例分析了Parcel機制的原理與實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • 淺談Android面向切面編程(AOP)

    淺談Android面向切面編程(AOP)

    這篇文章主要介紹了淺談Android面向切面編程(AOP),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Android仿通話來電界面效果

    Android仿通話來電界面效果

    這篇文章主要為大家詳細介紹了Android仿通話來電界面效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論