移动开发作业三:ContentProvider的应用

ContentProvider的应用

一、设计目标

1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;

2、请自建一个provider,然后在另一个app中使用resolver调用这个provider。

3、本次作业请启用新项目,理论上需要两个APP进行实验。

二、功能说明

使用contentprovider来实现app之间的数据共享,即可以在一个app中访问另一个app的数据。

三、代码解析

使用ContentProvider来进行数据共享时需要统一的数据访问放式,具体的,它通过URI映射来判断需要操作的数据库中的哪张表,并进行增、删、改、查。URI的用处就是描述路径。 URI格式为:schema+authority+path+id,其中schema在Android中固定设置为"content://“。authority为外部应用找到该ContentProvider的唯一标识,一般为包名。path即要操作的数据库表,如/zDB。id代码单个记录的URI,可省略,省略时表示整张表的数据。

具体代码实现如下(包含2个app):

provider app代码

首先,ContentProvider是一个抽象类,故需要我们定义一个MyContentProvider类来继承它并重写其各个方法。代码18~22重写了onCreate方法,将在创建ContentProvider时调用,对Dao层对象进行初始化。此外,还有数据库对应的增删改查方法,此处以insert方法为例,在其中调用myDao的DaoInsert方法。

MyDao中15、16行在构造函数中对SQLiteDatabase的操作对象进行初始化,代码19~24行即DaoInsert方法,该方法接收ContentValues参数,第20行进行数据库中的user表的插入操作将参数values插入Sqlite,21-23行将新插入的数据行号追加到URI后得到newUri,并调用 context.getContentResolver().notifyChange(newUri,null)方法通知ContentObserver数据发生了变动。 最后还有在AndroidManifest.xml中对MyContentProvider进行声明,如下:

resolver app代码

代码16行通过getContentResolver方法获取ContentResolver实例,在23行通过调用该实例的insert方法并指定URI来进行对provider app中的数据增删改查操作。此外,还要在本app的AndroidManifest.xml中配置包的可见性,因为在Android 11中为了用户的安全性和隐私性,引入了包的可见性概念。如果没有该声明。除了默认的一些应用外,其他应用之间不能直接进行交互。

插入数据前数据库中有2条记录:

插入后变为3条记录

五、源码仓库地址

经验分享 程序员 微信小程序 职场和发展