1.0 事实上这章特别难写,知识点比较清楚,比较少。但是代码量特别多,主要还是因为重复性的代码比较多,而且在细节方面,会用了某个方法,不解释又完全不知道这个方法干什么了这么屌。但是要相信自己,只要沉下心去阅读,会很快掌握的。
特别吐槽一句,挺讨厌的,把界面搞得跟特么广告网站似的。看的不烦吗?
2.0 本篇需要结合我的上一篇的内容:
链接:【Android】20.0 权限处理(二)——访问其他程序数据:读取联系人信息
主要写的是应用程序如何从另外一个应用程序中读取数据。
而这章的内容是相反的:如何给别的应用程序提供权限,以访问自己的数据。
本章内容可参考下面两篇相关文章:
链接:Android:关于ContentProvider的知识都在这里了!
链接:Android跨进程通信:图文详解 Binder机制 原理
3.0 话不多说,知识点放最后,先把项目贴上来。
这里涉及两个应用程序:
-
一个是之前已经写好的项目,DatabaseTest(所以该项目里面可能有与本篇内容无关的代码),主要作用是可以创建一个SQLite数据库,保存在该软件包名目录文件下。
-
另一个是新开的项目,ProviderTest,主要是用于操作DatabaseTest应用程序中的数据,可以进行增删查改。
两个项目的目录如下:
4.0 先看下DatabaseTest项目运行后的画面:
5.0本篇内容只需要这个应用程序在模拟器上装载即可,不要去“创建数据库”按钮,测试运行的时候,可以把Android studio中DatabaseTest项目关闭(稍后还需要向DatabaseTest项目中添加代码)。
6.0 ContentProvider,内容提供器,Android 四大组件之一
(Activity、Service、Broadcast Receiver、Content Provider)
关于什么是Android四大组件:
链接:android四大组件(组成)是什么,功能分别是
想要实现跨程序共享数据功能,官方推荐的方式就是这个——使用内容提供器。
一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的“数据库”。
ContentProvider类有6个抽象方法,在使用子类继承它的时候,需要将这6个方法全部重写。比如新建一个MyProvider 继承自ContentProvider ,代码示范如下(本代码和上面所述的两个项目无关,但可以便于我们实际理解):
这里需要特别说明下的是方法。
一个标准的内容URI的写法是这样的:
知道什么是内容URI的程序员看一眼就知道,我们期望访问的是com.example.app这个应用的table1表中的数据,或者格式如下:
表示我们期望访问的是com.example.app这个应用的table1表中id为1的数据
划线的重点来了:
1.内容URI主要有以上两种格式:
- 以路径结尾,表示期望访问该表中所有数据。
- 以id结尾,表示期望访问该表中拥有相应id的数据。
2.可以转成使用通配符来表示,通配符规则如下:
:表示匹配任意长度的任意字符。
:表示匹配任意长度的数字。
因此,内容URI分别可以改写成:
3.一个内容URI所对应的MIME字符串主要由3部分组成:
- 必须以vnd开头
- 如果内容URI以路径结尾,则后接,如果内容URI以id结尾,则后接。
- 最后接上
4.所以对于内容URI所对应的MIME类型格式为:
对于内容URI所对应的MIME类型格式为:
5.MIME数据类型
作用:指定某个扩展名的文件用某种应用程序来打开
如指定文件采用应用程序打开、指定文件采用应用程序打开
(当然,这里其实用不到这个知识点,因为只有上面所述的两种写法)
OK,理论到位,接着往下走。
7.0 这时候我们可以摆弄DatabaseTest项目中的代码了。它需要做到公开自己的数据。
首先,activity_main.xml这个布局文件,不需要起作用(虽然里面有一个Button控件,所以这里就不贴代码了)
然后,MainActivity.java也不需要增加什么代码(虽然里面有个数据库创建的程序响应):
8.0 MyDatabaseHelper类主要是数据库的创建:
类继承了类,这是一个抽象类,这个抽象类需要重写和方法,在这两个方法里面,我们可以实现创建、升级SQLite数据库。
9.0 在目录包名上右击,New→Other→Content Provider:
会弹出如下窗口:
我们将内容提供器命名为:
,authority指定为
,
属性表示是否允许外部程序访问我们的内容提供器,
表示是否启用这个内容提供器,都勾上,finish创建:
接着修改DatabaseProvider中的代码:
代码说明都在代码块中。
10.0 最后,内容提供器一定要在中注册,但是由于我们是使用软件的快捷方式创建的,注册这一步已经自动完成了:
标签内就是,其中:
- 属性指定了DatabaseProvider的类名
- 属性指定了DatabaseProvider的authority
- 属性和属性上面已经说了,根据我们创建时打钩的状态自动生成的,表示DatabaseProvider允许被其他应用程序进行访问。
11.0 DatabaseTest项目代码全部编写完毕。
一开始也说了,本篇内容只需要DatabaseTest这个应用程序在模拟器上装载即可,不要去“创建数据库”按钮,运行DatabaseTest项目后,可以把Android studio中DatabaseTest项目关闭了。
12.0 新建项目,ProviderTest。
先看布局文件:
效果很简单:
MainActivity.java:
13.0 运行:
“添加数据到BOOK”按钮
将数据库导出,在Navicat Premium中查看:
关于如何导出数据库文件并查看请参考:
链接:【Android】18.0 SQLite数据库——LitePal的使用及SQLite数据库怎么查看
“从BOOK中查询数据”按钮:
“更新数据到BOOK”按钮,然后再次导出数据库,查看数据库:
“从BOOK中删除数据”按钮,再“从BOOK中查询数据”按钮,没有Toast提示响应。再次导出数据库,查看数据库:
就这么些意思。
备注:更全面的理解可以参考本篇一开始提供的参考链接,本篇有助于那些需要实现类似功能的朋友,可以直接照猫画虎,先让自己的构思实现起来。
再备注:说实话,自己挺反感写太多理论东西,当它们扎堆的时候,完全不知道怎么用好伐。
把东西放在实际项目中,傻瓜式地先串起来run成功后,写两遍知识点就学得差不多了,再回头看看理论,简直不要太好懂……
再再备注:除了一开始写的两三篇文章版本控制比较乱之外,自己写的代码可以说:
- 1.都是用的版本
- 2.目标版本是,但模拟器跑的版本是
- 3.电脑系统
再再再备注:Navicat for Premium 9.0.2激活真的很讨厌……
END
今天的文章
Navicat for Premium 9.0.2激活(【Android】21.0 权限处理(三)——访问其他程序数据:提供数据给别的程序使用…)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/121837.html