一.实验环境:
Windows系统,Android Studio
二.界面功能
1.本次作业使用到了两个app,一个名称为ContentProvider,一个名称为ContentResolver
2.通过contentprovider相关组件进行不同app之间的数据库操作
3.通过sqlitedatabase来使用安卓内置的数据库,较为方便和安全
三.界面设计代码
ContentProvider
activity_main界面较为随意,不用在其中添加什么组件,重点在于java文件
MyDBHelper.java
这个文件是用来创建数据库和生成数据库,当第一次建立数据库时,onCreate函数将会被调用,可以在logcat上观察到它的生命周期。
MyDAO.java
在这个java文件中,首先利用MyDBHelper的构造函数构建了一个名为“xyhDB”的数据库,版本为1,同时通过getWriableDatabase函数使得此数据库可写,如果不加入这个函数那么在MyDBHelper中的onCreate函数不会被调用,数据库就无法正常生成。
后面还有着插入函数,这里提到了一个概念是uri,关于uri的介绍如下
统一资源标识符(URI)
定义:Uniform Resource Identifier,即统一资源标识符
作用:唯一标识 ContentProvider & 其中的数据,外界进程通过 URI 找到对应的ContentProvider & 其中的数据,再进行数据操作
具体使用
URI分为 系统预置 & 自定义,分别对应系统内置的数据(如通讯录、日程表等等)和自定义数据库
那么在此处uri如图中中所示,是一个自定义uri,对于插入时调用的函数,withAppendId函数用来插入可变的数据,如图中的uri,而AppendId用来插入不变的,固定的信息,此时第一个参数的数据类型就变成了Builder。
MyContentProvider.java
首先声明全局变量myDAO
在insert函数中返回对应的Uri类型的值
在onCreate函数中调用MyDAO的构造函数(若之间在MyContentProvider中调用MyDAO的构造函数会造成报错,程序无法正常运行)
MainActivity.java
因为在MyDAO的构造函数中需要使用到创建数据库的MyDBHelper函数,而此函数中的第一个参数是context类型,则可在MainActivity中使用this将context类型的数据传入MyDAO的构造函数中使其可以正常调用MyDBHelper函数。
ContentResolver
activity_main
按下INSERT按钮即可向数据库中加入数据
MainActivity.java
在这里首先通过了ContentResolver类和ContentValues类创建对象,使用了put函数将需要的值填入values中,最后绑定按钮的点击事件为resolver调用insert插入函数即可。
四、ContentProvider优点和总结
1.安全
ContentProvider为应用间的数据交互提供了一个安全的环境:允许把自己的应用数据根据需求开放给 其他应用 进行 增、删、改、查,而不用担心因为直接开放数据库权限而带来的安全问题
2.访问简单 & 高效
对比于其他对外共享数据的方式,数据访问方式会因数据存储的方式而不同:
(1)采用 文件方式 对外共享数据,需要进行文件操作读写数据;
(2)采用 Sharedpreferences 共享数据,需要使用sharedpreferences API读写数据,这使得访问数据变得复杂 & 难度大。
(3)而采用ContentProvider方式,其 解耦了 底层数据的存储方式,使得无论底层数据存储采用何种方式,外界对数据的访问方式都是统一的,这使得访问简单 & 高效
五、运行结果展示
数据库中的表student初始状态
点击INSERT按钮之后
可以发现数据已插入成功,目标完成
六 .实验小结
本次作业第一次实现了两个app之间的操作,之前都是所有的操作都在一个项目内,这让我觉得很新奇,在这次作业中我只实现了插入操作,但是对于CRUD操作,一个能实现的话,其他几个也可以以相同的原理实现,在实验中遇到的问题是,在开始测试程序时每次一点击INSERT按钮就报错,在经过网络上的资料搜索,我得知需要在resolver项目中的manifest中加入
之后就可以正常运行和实现了。
最后附上源代码:
ContentProvider源代码:https://gitee.com/xuyuehuan/ContentProvider.git
ContentResolver源代码:https://gitee.com/xuyuehuan/ContentResolver.git