开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
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:///
(1)以路径结尾:表示期望访问该表地所有数据
(2)以id结尾:表示期望访问该表拥有相应id的数据
:authorities是用于对不同的应用程序做区分的,一般会采用包名的方式命名,比如包名为com.example.myapplication,那么为com.example.myapplication.provider。
: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
(1)重写ContentProvider类的6个抽象方法。
- onCreate()。初始化ContentProvider的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回true表示ContentProvider初始化成功,返回false则表示失败。
- query()。从ContentProvider中查询数据。uri参数用于确认查询哪张表,projection参数用于确定查询哪些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。
- insert()。向ContentProvider中添加一条数据,uri参数用于确定要添加的表,待添加的数据保存在values参数中。添加完成后,返回一个用于表示这条新纪录的URI。