戏说江湖静如水,游荡江湖才有情。我就是江湖中的一个戏子。

俗话说,入行先入门。作为一名android学习者,四大组件是android中的核心组件,岂有不学之理。然而,本人才疏学浅,叙述略有不当之处,敬请谅解。


ContentProvider为存储和提供数据提供统一的接口,可以在不同的应用程序间共享数据。

ContentProvider

1.在AndroidMainfest.xml中声明

<providerandroid:authorities="com.android.test.TestContentProvider"android:name=".TestContentProvider"/>

authorities是ContentProvider的唯一表示,,让系统可以方便的找到对应的ContentProvider以便进行操作。

这样我们的自定义的ContentProvider就声明好了,现在来实现。

2.继承并实现ContentProvider的方法

public class TestContentProvider extends ContentProvider {@Overridepublic boolean onCreate() {return false;}@Nullable@Overridepublic Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {return null;}@Nullable@Overridepublic String getType(@NonNull Uri uri) {return null;}@Nullable@Overridepublic Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {return null;}@Overridepublic int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {return 0;}@Overridepublic int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {return 0;}
}
SqliteOpenHelper

我们可以看到,继承ContentProvider至少要重写六个方法,其中onCreate方法使用来初始化数据用的,一般用来初始化SqliteOpenHelper。剩下的就是对数据库的增删改查以及获取数据的mimeType。

既然疏导了SqliteOpenHelper,那么它是用来干什么的呢?SqliteOpenHelper从字面意义上来看就是数据库连接的工具,一般我们想要对操作android内部的数据库需要继承该类。
继承并实现SqliteOpenHelper

public class TestDatabaseHelper extends SQLiteOpenHelper {public TestDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {}
}

需要实现onCreate和onUpgrade方法,其中onCreate是用来创建数据的,一般我们的数据的创建,各种表,视图的创建都是在该方法中实现的。onUpgrade是在数据库升级的时候调用的,通过构造方法传入不同的version可以来标明数据库的升级,在该方法中我们可以通过oldVersion和newVersion来进行比较,提示用户的升级,并且可以修改数据库。

Uri

讲了这么多,你可能会有疑问,那我们是怎样去调用呢?通过对ContentProvider的实现你可能已经发现了,对数据的增删改查都需要传入uri,这个uri就是关键。首先我们得了解一下Uri的构成。一般Uri的构成可以分为三个部分,scheme,authorities,path。

现在我们来用一个Uri来作为示例进行讲解吧
content://com.android.test.TestContentProvider/test/1

名称 示例 作用
scheme content:// Android中已经规定了scheme为content://
authorities com.android.test.TestContentProvider 这个就是我们provider中定义的authorities
path test/1 要查询数据的表或者其id

我们知道了Uri的构成,那么怎样去生成这样一个Uri呢?

Uri uri = Uri.prase("content://com.android.test.TestContentProvider/test");

这样我们就生成了一个uri,然后我们就可以通过ContentResolver就可以通过Uri来对数据库进行增删改查了。

Uri uri = Uri.prase("content://com.android.test.TestContentProvider/test");
ContentValues cv = new ContentValues();
//此处省略数据的添加  cv.add()...
getContentResolver().insert(uri,cv);

可能你又要问了,那系统怎么知道我们要查询的是哪个表,或者是哪个id呢?其实这中间还有一个关键的类没有说,那就是UriMatcher
UriMatcher就是用来匹配相应的uri,然后返回对应的code,以便用户进行操作。
我们来实际操作一下

首先需要在自定义ContentProvider中定义UriMatcher。

private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

声明对应的常量,并进行addUri操作,addUri操作一般放在静态代码块中,这样在类的加载时可以完成uri的添加操作。

private static final Stirng AUTHORITY = "co.android.test.TestContentProvider";
private static final int TEST = 1;
static  {matcher.addUri(AUTHORITY,"test",TEST);
}

用户匹配Uri并进行处理。

switch (matcher.match(uri)) {case TEST:break;default:break;
}

注意


1.new UriMatcher中的参数一般选UriMatcher.NO_MATCH

2.addUri中三个参数分别代表的含义:AUTHORITY——provider的唯一标识,“test”——查询的表或者id(“test/#”——代表查询id),TEST——匹配成功后返回的code值

3.match匹配成功后返回的code值即是addUri中添加的第三个参数(例如上面例子中的TEST)


写到这里,关于ContentProvider的介绍就差不多了,你是否能写出自己的ContentProvider呢?

转载于:https://my.oschina.net/u/3579120/blog/1507559

戏说Android四大组件之ContentProvider相关推荐

  1. Android四大组件之ContentProvider 全面解析,ContentResolver源码解析如何调用其它APP的ContentProvider

    今天来总结下Android中的ContentProvider(以下简称CP),具体代码请见https://github.com/Mangosir/ContentProviderReview/tree/ ...

  2. Android四大组件之ContentProvider详解

    1. 为什么需要内容提供者contentProvider? 为不同的应用之间数据共享提供统一的访问接口,内容提供者的作用 把私有的数据给暴露出来 2. 内容提供者原理? 原理:可以把ContentPr ...

  3. Android四大组件之ContentProvider

    1.ContentProvider定义 这里通过一个实际的例子来说明ContentProvider(内容提供者)是什么,作用是什么 短信应用要访问通讯录应用中的数据,是不能直接访问的,应用通讯录的中的 ...

  4. Android四大组件之ContentProvider(二)读取设备上的图片、音频和视频

    Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,通过Content Provider的方式提供给用户.当设备开机或者有SD卡插拔等事件发生时, ...

  5. Android 四大组件之ContentProvider 访问通讯录进行增删改查操作

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,

  6. Android——四大组件、六大布局、五大存储

    一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...

  7. Android 四大组件 与 MVC 架构模式

    作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...

  8. android四大组件小整

    原文来自http://www.jianshu.com/p/478a34af17df 所谓的android四大组件一次是Activity.Service.BroadcastReceiver和Conten ...

  9. Android添加手机黑名单,手机来电拦截实现详解与Demo,一个不错的练手项目,涵盖Android四大组件。

    简介 这是一个小应用的详解,这个应用可以添加手机黑名单,拦截手机黑名单的来电.通过这个小demo,我们可以对Android四大组件的应用场景有个具体的了解,可以说是一个不错的练手项目. 下面给出下载地 ...

最新文章

  1. IT小妙招之:快马加鞭,Windows 7启动大提速
  2. 关于RelativeLayout设置垂直居中对齐不起作用的问题
  3. 代码重构(二):类重构规则
  4. 宁波python学习_python学习第十五天
  5. 【Linux】一步一步学Linux——passwd文件详解(107)
  6. jquery的全选和多选操作
  7. OpenAL跨平台音效API的安装与移植
  8. Kali Linux 秘籍 第三章 高级测试环境
  9. MySQL Replication主主复制—(实例)
  10. vue基础之组件(创建,data,切换,父子以及同级之间的传值,插槽solt)
  11. java如何实现成绩排序_java 成绩排序
  12. IEEE ACCESS模板下载
  13. spring——工厂模式
  14. 内存中的存储空间(栈空间、堆空间、数据段、代码段)
  15. Problem D 牛栏(aggr)
  16. 至尊宝代表哪一种人?
  17. 【Android安全】priv-app 系统应用权限
  18. Java程序员该如何准备明年的「金三银四」跳槽季,你准备好了吗?
  19. 【翻译】BKZ 2.0: Better Lattice Security Estimates 论文翻译
  20. AJAX-Cache:一款好用的Ajax缓存插件

热门文章

  1. python爬虫之爬取简书中的小文章标题
  2. 为什么要学数据结构?
  3. Windows 普通模式切换到管理员权限模式 runas
  4. 考研这么累,能支持你坚持到底的是什么?
  5. Halcon一维码和二维码识别
  6. dll与exe的区别
  7. Tiktok运营知识:刚开始如何快速涨粉?上热门
  8. Synchronized你以为你真的懂?
  9. SpringBoot整合RabbitMq实战(一)
  10. 在线教育大数据营销平台实战(搭建篇)