提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
ContentProvider组件
提示:以下是本篇文章正文内容,下面案例可供参考
一、设计目标
1.使用安卓四大组件ContentProvider,用其方法进行数据获取
2.在两个app之间之间进行数据库的操作。
二、功能说明
1.使用到两个app,一个是provider,一个是resolver
2.使用安卓内置的SQLite数据库来进行数据库操作
3.利用ContentProvider实现两个进程之间的通信,在resolver中调用provider实现数据库的增删改查。
三、代码解析
1.provider APP
① 创建数据库和生成数据库
②ContentProvider中方法实现dao类
1.在dao类的构造函数中新建一个数据库,同时使用getWritableDabase()函数来使此数据库可写,调用这个函数的同时MyDBHelper中的onCreate()函数也会执行,生成表。
2.统一资源标识符(URI)用来唯一标识 ContentProvider中的数据,外界进程通过 URI 找到对应的ContentProvider中的数据,再进行数据操作。
3.URI分为 系统预置 和自定义,分别对应系统内置的数和自定义数据库。这里dao类中的uri是一个自定义uri。
③MyContentProvider
在这个里面首先定义一个dao类变量,用于之后调用其中的方法,这里需要在onCreate中调用dao类的构造函数,不然会报错。
在这个作业里主要实现的就是不同app之间数据库的Insert操作,对于其他的crud,道理都是一样的,所以这里在ContentProvider的insert方法里调用在dao类中实现的insert方法。
⑤ MainActivity中调用dao类的构造函数以及在Manifest中注册provider
这里的name就是你定义的provider类的名字
authorities就是你定义的Authority的名字
这里一定要注册,不然等会reslover调用provider的时候会找不到这个uri
2.reslover APP
①界面
②MainActivity
③启动reslover之后点击insert按钮闪退解决
异常:java.lang.IllegalArgumentException: Unknown URL content:
解决:Android高版本收紧了权限以防止程序随便访问其他程序的文件,所以需要在Manifest中加入语句:
<queries>
<package android:name="com.itls.providertest"></package>
</queries>
name为你的provide的r包名
四、运行截图展示
启动provider,查看数据库的时候可能显示数据库一直是closed状态,这里建议debug启动providerAPP,这个时候数据库就不会一启动就是closed状态
1.未执行insert之前,这里显示的是provider的数据库
2.启动reslover,并执行insert后
这里显示的还是provider app的数据库,但我们是在reslover中进行insert操作的,实现了不同app之间的通信。
五、Gitee仓库
链接: 第三次作业