-
「onCreate()」:一般用来初始化底层数据集和建立数据连接等工作
-
「getType()」:用来返回指定Uri的MIME数据类型,
-
若Uri是单条数据,则返回的MIME数据类型以vnd.Android.cursor.item开头;
-
若Uri是多条数据,则返回的MIME数据类型以vnd.android.cursor.dir/开头。
数据访问方法**「如insert(Uri,ContentValues)和update(Uri,ContentValues,Bundle)」** 可以同时从多个线程调用,并且必须是线程安全的。其他方法**「如onCreate()」** 仅从应用程序主线程调用,并且必须避免执行冗长的操作。请参阅其预期线程行为的方法描述。
- 声明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);}
- 注册ContentProvider
在AndroidManifest.xml文件中的 application节点下使用标签注册。样例:
<android:authorities=“com.scc.userprovider”
android:name=“.UserProvider”
android:exported=“true”/>
- 通过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);
- 指定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);
- 修改数据
UserInfoBean bean = new UserInfoBean(“蚩尤”, 32, “12:00”);
ContentValues cv = new ContentValues();
cv.put(UserInfoContent.USER_NAME, bean.getName());
cv.put(UserInfoContent.USER_AGE, bean.getAge());
cv.put(UserInfoContent.USER_UPDATE_TIME, bean.getUpdate_time());
getContentResolver().update(UserInfoContent.CONTENT_URI, cv, “_id=18”, null);
- 查询数据
Cursor cursor = getContentResolver().query(UserInfoContent.CONTENT_URI, null, selection, null, null);
//循环取出游标指向的每条用户记录
while (cursor.moveToNext()) {
UserInfoBean user = new UserInfoBean();
user.name = cursor.getString(cursor.getColumnIndex(UserInfoContent.USER_NAME));
user.age = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_AGE));
user._id = cursor.getString(cursor.getColumnIndex(UserInfoContent._ID));
user.update_time = cursor.getString(cursor.getColumnIndex(UserInfoContent.USER_UPDATE_TIME));
userList.add(user); //添加到用户信息列表
}
cursor.close(); //关闭数据库游标
Log.e(getClass().getName(), “Query用户:” + String.format(“当前共找到%d个用户”, userList.size()));
跨应用和本应用使用ContentProvider一样的方法,这边就不做复制了。
例5的Uri是拼接字段,但是拼接后的结果 「content://com.scc.userprovider/user。」
跨平台使用getContentResolver().方法 的第一个参数:
「Uri uricontent = Uri.parse(“content://com.scc.userprovider/user”);」
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(uricontent, cv);
Log.e(getClass().getName(), “insert:” + uri);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/5ee12e5b68907187897de36c8ed5deea.jpeg)
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-COtCkx57-1712390388320)]
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
[外链图片转存中…(img-LI4IiD0U-1712390388320)]
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!