-
「使用ContentProvider存储数据」
-
网络存储数据
咱们今天就来学习一下ContentProvider。作为Android四大巨头之一的他有点名不副实,因为在一般的开发过程中,使用的次数比较少。大部分应用的数据缓存用SharedPreferences就能搞定了。
「ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法。」
ContentProvider可以指定需要共享的数据,而其他应用程序则可以在不知道数据来源、路径的情况下,对共享数据进行增删改查等操作。
在Android系统中,许多Android系统内置的数据也是通过ContentProvider提供给用户使用,例如通讯录、音视频文件和图像文件等。
一、什么是ContentProvider
-
ContentProvider是Android的四大组件之一,以标准化的方式在Android 应用间共享数据。
-
ContentProvider封装的数据存储以及增删改查等,并且必须实现一个对外统一的接口(Uri)。
二、什么是Uri
Uri(通用资源标识符 Universal Resource Identifer),代表数据操作的地址,每一个ContentProvider都会有唯一的地址。
ContentProvider使用的Uri语法结构如下:
content://authority/data_path/id
-
「content://」 是通用前缀,表示该Uri用于ContentProvider定位资源。
-
「authority」 是授权者名称,用来确定具体由哪一个ContentProvider提供资源。因此一般authority都由类的小写全称组成,以保证唯一性。
-
「data_path」 是数据路径,用来确定请求的是哪个数据集。
-
「id」 是数据编号,用来请求单条数据。如果是多条这个字段忽略。
样例:
content://com.scc.userprovider/user多条
content://com.scc.userprovider/user/10单条
三、什么是ContentResolver
-
ContentResolver是数据调用者,ContentProvider将数据发布出来,通过ContentResolver对象结合Uri进行调用。
-
一般来说ContentProvider是单例模式,多个应用可通过ContentResolver调用ContentProvider的增删改查操作数据,ContentResolver调用的数据操作会让同一个ContentProvider处理。
四、创建ContentProvider
1、创建一个类让其继承ContentProvider,并重载6个函数
需要实现的主要方法是:
-
「insert()」、「delete()」、「update()」、「query()」:用于对数据集的增删改查操作。
-
「onCreate()」:一般用来初始化底层数据集和建立数据连接等工作
-
「getType()」:用来返回指定Uri的MIME数据类型,
-
若Uri是单条数据,则返回的MIME数据类型以vnd.Android.cursor.item开头;
-
若Uri是多条数据,则返回的MIME数据类型以vnd.android.cursor.dir/开头。
数据访问方法**「如insert(Uri,ContentValues)和update(Uri,ContentValues,Bundle)」** 可以同时从多个线程调用,并且必须是线程安全的。其他方法**「如onCreate()」** 仅从应用程序主线程调用,并且必须避免执行冗长的操作。请参阅其预期线程行为的方法描述。
2、声明Uri规则,实现UriMatcher
咱先来看看UriMatcher是干嘛的,UriMatcher本质上是一个文本过滤器,有助于解析Uri,用在ContentProvider中帮助我们过滤,分辨出查询者想要查询哪个数据表。
UriMatcher的构造函数中,UriMatcher.NO_MATCH是Uri无匹配时的返回代码,值为-1。addUri()方法用来添加新的匹配项,语法为:
public void addUri(String authority, String path, int code)
-
authority表示匹配的授权者名称;
-
path表示数据路径;
-
code表示返回代码。
下面咱搞个实例:
//这里的名称必须与AndroidManifest.xml中android:authorities保持一致
public static final String AUTHORITY = “com.scc.userprovider”;
//数据路径
public static final String PATH_USERS = “user”;
//访问ContentProvider的URL
public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTHORITY + “/” + PATH_USERS);
//返回代码
public static final int USER_INFO = 1;
//创建UriMatcher对象
private static UriMatcher uriMatcher;
//创建静态代码块
static {
//实例化UriMatcher对象
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//参数1:authority;参数2:路径;参数3:自定义代码
uriMatcher.addURI(UserInfoContent.AUTHORITY, UserInfoContent.PATH_USERS, USER_INFO);
}
3、注册ContentProvider
在AndroidManifest.xml文件中的 application节点下使用标签注册。样例:
<android:authorities=“com.scc.userprovider”
android:name=“.UserProvider”
android:exported=“true”/>
五、使用ContentProvider
1、通过insert()方法添加单条数据
ContentValues cv = new ContentValues();
cv.put(UserInfoContent._ID, bean.get_id());
cv.put(UserInfoContent.USER_NAME, bean.getName());
cv.put(UserInfoContent.USER_AGE, bean.getAge());
cv.put(UserInfoContent.USER_UPDATE_TIME, bean.getUpdate_time());
Uri uri = getContentResolver().insert(UserInfoContent.CONTENT_URI, cv);
Log.e(getClass().getName(), “insert:” + uri);
- 通过bulkInsert()方法添加多条数据
ContentValues[] arrayValues = new ContentValues[10];
//实例化每一个ContentValues…
int count = getContentResolver().bulkInsert(UserInfoContent.CONTENT_URI, arrayValues);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后我想说
为什么很多程序员做不了架构师?
1、良好健康的职业规划很重要,但大多数人都忽略了
2、学习的习惯很重要,持之以恒才是正解。
3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展
4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
一些学习技能。**
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-9OjOniHM-1712691326211)]
里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!