Android基础到进阶四大组件之ContentProvider详解

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()」** 仅从应用程序主线程调用,并且必须避免执行冗长的操作。请参阅其预期线程行为的方法描述。

  1. 声明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);}

  1. 注册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);

  1. 指定ID删除单条数据

int delete = getContentResolver().delete(UserInfoContent.CONTENT_URI, “_id=12”, null);

Log.e(getClass().getName(), “delete(失败返回-1):” + delete);

  • 通过selection语句删除多条数据

String selection = UserInfoContent._ID + “>12”;

int result = getContentResolver().delete(UserInfoContent.CONTENT_URI, selection, null);

  1. 修改数据

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

另外,描述问题一定要慢!不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤…所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

…(img-xxfZXSsz-1711783892916)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-LixrJxpA-1711783892916)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值