網站首頁 編程語言 正文
1、注冊ContentProvider
右擊com.example.myapplication包->New->Other->Content Provider。會彈出窗口
點擊finish,完成創建ContentProvider類,這時你可以在注冊代碼中看到
<provider android:name=".MyContentProvider" android:authorities="com.example.myapplication.provider" android:enabled="true" android:exported="true"></provider>
注冊ContentProvider時通常指定屬性
屬性 | 描述 |
name | 指定該ContentProvider的實現類的類名 |
authorities | 指定該ContentProvider對應的URI |
enabled | 指定該ContentProvider是否可用 |
exported | 指定該ContentProvider是否允許其他應用調用 |
2、內容URI
ContentResolver中的增刪改查方法都不接收表名參數,而是使用一個Uri參數代替,這個參數被稱為內容URI。
內容URI的標準格式
content://<authorities>/<path>
(1)以路徑結尾:表示期望訪問該表地所有數據
(2)以id結尾:表示期望訪問該表擁有相應id的數據
<authorities>:authorities是用于對不同的應用程序做區分的,一般會采用包名的方式命名,比如包名為com.example.myapplication,那么<authorities>為com.example.myapplication.provider。
<path>:path是用于對同一應用程序的不同表做區分的,比如com.example.myapplication.provider/table1。
通配符
*表示匹配任意長度的任意字符
#表示匹配任意長度的數字
一個能夠匹配任意表的內容URI格式
content://com.example.myapplication.provider/*
一個能夠匹配table表中任意一行數據的內容URI格式
content://com.example.myapplication.provider/table1/#
把內容URI字符串解析成Uri對象
val uri=Uri.parse("content://com.example.myapplication.provider/table1")
3、創建自己的ContentProvider
重寫ContentProvider類的6個抽象方法
- onCreate()。初始化ContentProvider的時候調用。通常會在這里完成對數據庫的創建和升級等操作,返回true表示ContentProvider初始化成功,返回false則表示失敗。
- query()。從ContentProvider中查詢數據。uri參數用于確認查詢哪張表,projection參數用于確定查詢哪些列,selection和selectionArgs參數用于約束查詢哪些行,sortOrder參數用于對結果進行排序,查詢的結果存放在Cursor對象中返回。
- insert()。向ContentProvider中添加一條數據,uri參數用于確定要添加的表,待添加的數據保存在values參數中。添加完成后,返回一個用于表示這條新紀錄的URI。
- updata()。更新ContentProvider中已有的數據,uri參數用于確定更新哪一張表中的數據,新數據保存在values參數中,selection和selectionArgs參數用于約束更新哪些行,受影響的行數將作為返回值返回。
- delete()。從ContentProvider中刪除數據。uri參數用于確定刪除哪一張表中的數據,selection和selectionArgs參數用于約束刪除哪些行,被刪除的行數將作為返回值返回。
- getType()。根據傳入的內容URI返回相應的MIME類型。
getType方法中,一個內容URI所對應的MIME字符串主要由3部分組成,Android對這3部分做了如下格式規定
- 必須以vnd開頭
- 如果內容URI以路徑結尾,則后接android.cursor.dir/。
- 如果內容URI以id結尾,則后接android.cursor.item/。
- 最后接上vnd.<acthority>.<path>。
例子:content://com.example.myapplication.provider/table1
MIME類型:vnd.android.cursor.dir/vnd.com.example.myapplication.provider.table1
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int { } override fun getType(uri: Uri): String? { } override fun insert(uri: Uri, values: ContentValues?): Uri? { } override fun onCreate(): Boolean { } override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? { } override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int { }
(2)利用UriMatcher這個類實現匹配內容URI的功能,來判斷出調用方期望訪問的時哪張表中的數據。
UriMatcher的addURI()方法,接收三個參數,可以分別把authority、path和一個自定義代碼傳進去。這樣,當調用UriMatcher的match()方法時,把一個Uri對象傳入,就會返回一個與這個Uri對象匹配的一個自定義代碼。
class MyContentProvider : ContentProvider() { private val table1Dir=0 private val table1Item=1 private val table2Dir=2 private val table2Item=3 private val uriMatcher=UriMatcher(UriMatcher.NO_MATCH) init { uriMatcher.addURI("com.example.app.provider","table1",table1Dir) uriMatcher.addURI("com.example.app.provider","table1/#",table1Item) uriMatcher.addURI("com.example.app.provider","table2",table2Dir) uriMatcher.addURI("com.example.app.provider","table2Item",table2Item) } ... override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? { when(uriMatcher.match(uri)){ table1Item->{ //查詢table1表中的所有數據 } table1Item->{ //查詢table1表中的單條數據 } table2Dir->{ //查詢table2表中的所有數據 } table2Item->{ //查詢table2表中的單條數據 } } } ... }
4、訪問其他程序中的數據
1、ContentResolver的基本用法
要訪問ContentProvider中共享的數據,就要調用Context的getContentResolver()方法獲取ContentResolver的實例,然后對數據進行增減改查的操作。
(1)查詢
val cursor=contentResolver.query(uri,projection,selection,selectionArgs,sortOrder) if (cursor != null) { while (cursor.moveToNext()){ val column1=cursor.getString(cursor.getColumnIndex("column1")) val column2=cursor.getString(cursor.getColumnIndex("colum2")) } cursor.close() }
(2)增加
val values= contentValuesOf("column1" to "text","column2" to 1) contentResolver.insert(uri,values)
(3)修改
val values= contentValuesOf("column1" to "") contentResolver.update(uri, values,"column1 = ? and column2 = ?", arrayOf("text","1"))
(4)刪除
contentResolver.delete(uri,"column2 = ?", arrayOf("1"))
原文鏈接:https://blog.csdn.net/weixin_63357306/article/details/126597714
相關推薦
- 2022-07-14 docker搭建kafka集群的方法實現_docker
- 2022-09-02 一文詳解Python中的重試機制_python
- 2022-06-27 python?包中的sched?事件調度器的操作方法_python
- 2022-03-25 C語言中字符型數據和浮點型數據介紹_C 語言
- 2022-09-29 go日志庫logrus的安裝及快速使用_Golang
- 2023-11-15 Latex解決表格過寬問題,自適應調整寬度;自動調整適合的表格大小
- 2022-04-03 sqoop如何指定pg庫的模式(方法詳解)_相關技巧
- 2023-12-16 六個開發者必知必會的Git命令
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支