日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 提供的方法,Android编程之创建自己的内容提供器实现方法

發(fā)布時間:2024/7/19 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 提供的方法,Android编程之创建自己的内容提供器实现方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

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

前面已經(jīng)提到過,如果想要實現(xiàn)跨程序共享數(shù)據(jù)的功能,官方推薦的方式就是使用內容提供器,可以通過新建一個類去繼承 ContentProvider 的方式來創(chuàng)建一個自己的內容提供器。 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()

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

2.??? query()

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

3.??? insert()

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

4.??? update()

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

5.??? delete()

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

6.??? getType()

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

回顧一下,一個標準的內容 URI 寫法是這樣的:

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

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

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

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

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

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

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

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

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

接著,我們再借助 UriMatcher 這個類就可以輕松地實現(xiàn)匹配內容 URI 的功能。UriMatcher 中提供了一個 addURI()方法,這個方法接收三個參數(shù),可以分別把權限、路徑和一個自定義 代碼傳進去。這樣,當調用 UriMatcher 的 match()方法時,就可以將一個 Uri 對象傳入,返 回值是某個能夠匹配這個 Uri 對象所對應的自定義代碼,利用這個代碼,我們就可以判斷出 調用方期望訪問的是哪張表中的數(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 的實例,并調用 addURI()方法,將期望匹配的內容 URI 格式傳 遞進去,注意這里傳入的路徑參數(shù)是可以使用通配符的。然后當 query()方法被調用的時候, 就會通過 UriMatcher 的 match()方法對傳入的 Uri 對象進行匹配,如果發(fā)現(xiàn) UriMatcher 中某 個內容 URI 格式成功匹配了該 Uri 對象,則會返回相應的自定義代碼,然后我們就可以判斷 出調用方期望訪問的到底是什么數(shù)據(jù)了。

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

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

1.??? 必須以 vnd 開頭。

2.??? 如果內容 URI 以路徑結尾,則后接 android.cursor.dir/,如果內容 URI 以 id 結尾, 則后接 android.cursor.item/。

3.??? 最后接上 vnd..。

所以,對于 content://com.example.app.provider/table1 這個內容 URI,它所對應的 MIME

類型就可以寫成:

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

對于 content://com.example.app.provider/table1/1 這個內容 URI,它所對應的 MIME 類型 就可以寫成:

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

現(xiàn)在我們可以繼續(xù)完善 MyProvider 中的內容了,這次來實現(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;

}

}

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

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

總結

以上是生活随笔為你收集整理的android 提供的方法,Android编程之创建自己的内容提供器实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费精品一区 | 天堂av一区二区三区 | 老司机久久精品视频 | 久久精品无码毛片 | 国产三级精品三级 | 午夜精品久久久久久久四虎美女版 | 国产天堂久久 | 亚洲AV成人无码久久精品巨臀 | 国产理论av| 欧美 日韩 中文字幕 | 四虎永久在线观看 | 欧美成人久久 | 理论在线视频 | 官场艳妇疯狂性关系 | 欧美狠狠操| 97超碰人人在线 | 高跟av| 筱田优全部av免费观看 | 日本黄色片段 | 91丝袜一区二区三区 | 舒淇裸体午夜理伦 | 日本三级一区 | 日日av| 人人爽av | 一区二区的视频 | 亚洲综合影院 | 欧美一级无毛 | 毛片成人网 | 日韩电影精品 | 亚洲大逼 | 国产精品免费看久久久无码 | 99草在线视频 | 国产美女福利 | 欧美激情欧美激情在线五月 | 美丽姑娘免费观看在线观看 | 在线免费观看一区二区三区 | 97国产视频| 国产一区 在线播放 | 国产欧美在线 | 青青草欧美 | 99久久久无码国产精品性波多 | 中国免费一级片 | 亚洲乱码国产一区三区 | 日韩精品视频在线观看免费 | 久久亚洲精选 | 99色综合| 亚洲www在线观看 | 人人人草 | 国产在线拍揄自揄拍无码 | 国产freexxxx性播放麻豆 | 国产日韩在线观看视频 | 国产成人自拍视频在线 | 日韩在线观看中文字幕 | 小草av| 天天躁日日摸久久久精品 | 东京干手机福利视频 | 日本资源在线 | 经典三级av在线 | 一本色道久久综合亚洲精品酒店 | 天使色吧 | 国产av人人夜夜澡人人爽麻豆 | 午夜天堂精品久久久久 | 久久久久人妻一区精品色 | 国产日韩网站 | 亚洲免费在线观看视频 | 国产成人av网 | 午夜影视免费 | 国产人与禽zoz0性伦 | 黄色a级免费| 国产伦精品一区二区三区视频黑人 | 欧美精品少妇 | 全部毛片永久免费看 | 国产成人+综合亚洲+天堂 | 免费观看的av | 午夜一二三| 日本a大片 | 色呦呦在线免费观看 | 日本视频在线播放 | 夜夜操网站 | 欧美激情成人网 | 亚洲天堂爱爱 | 最新91视频| 国产xxxx | 在线a网| 国产又粗又猛又黄又爽 | 91精品综合久久久久久五月天 | 欧美一卡二卡在线观看 | 国产高清视频在线 | 麻豆视频污 | 在线网站黄 | 少妇人妻综合久久中文字幕 | 不卡视频国产 | 色欧美亚洲 | www在线观看视频 | 曰批又黄又爽免费视频 | 日韩少妇中文字幕 | 欧美10p | 亚洲丝袜在线观看 | 国模无码大尺度一区二区三区 |