前言:
Android数据持久化(保存数据,当APP退出后,下次访问数据还在)的方法:
- 文件存储
- 存在packname下
- 存在SD卡中
- SharedPreferences存储
- 数据库存储
- 数据库更新
- 增加新的表
- onUpgrade()里面根据oldVersion 执行新建表的指令
- 更新表内容
- 添加新的字段
- alert table tableName add colume newName type;
- 删除已有字段
- 根据原表创建一张新表 Create table newTableName as select ID,name from oldTableName
- 删除原表 drop oldTableName if exists oldNameTable
- 将新表重命名为旧表名称 alter table newNameTable rename oldTableName
- 添加新的字段
- 增加新的表
- 数据库更新
- 使用这些持久化技术保存的数据只能在当前APP中访问。
- 虽然文件和SharedPreferences存储中提供了MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE两种模式,用于共给其他应用程序访问当前应用的数据,但这两种,但是在Android4.2版本中已经被废弃。
- Android不再推荐使用这种方式来跨程序数据共享功能,而是使用更加安全可靠的内容提供技术!
可共享的数据:
- 系统的电话薄
- 短信
- 媒体库
- 等。。。
Content Provider
内容提供器 ,用于在不同应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。
不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器
- 可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。
内容提供者用法:
- 使用现有的内容提供者来读取和操作相应程序中的数据;
- 创建自己的内容提供器给我们的程序提供外部访问接口。
访问其他程序中的数据
类似微信发送手机的图片,访问手机相册
当一个APP通过内容提供器对自己的数据提供了外部访问接口;
任何其他的APP就都可以对这部分数据进行访问。
Android系统中自带的电话簿、短信、媒体库等程序都提供了类似的访问接口,这就使得第三方应用程序可以充分地利用这部分数据来实现更好的功能。
内容提供器到底是如何使用的。
对每一个APP来说,如果想访问Content Provider中共享的数据
- 借助ContentResolve类,通过Context的个图ContentResolver()方法获取到该类的实例。
ContentResolver中提供了一系列的方法用于对数据进行CRUD操作
- insert() 添加数据
- upDate()更新数据
- delete()删除数据
- query()查询
SQLiteDatabase也是使用这几个方法来进行CRUD操作,在方法参数上不同。
-ContentResolver中的增删改查搜不接受表名参数,而是用Uri参数代替,被称为内容URI。- 内容URI给内容提供器中的数据建立了唯一标识符,它主要由两部分组成,权限(authority)和路径(path)。
- 权限是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。
- 路径则是用于对同一应用程序中不同的表做区分的,通常都会添加到权限的后面。
- ContentResolver中的增删改查方法才都接收Uri对象作为参数,因为使用表名的话系统将无法得知我们期望访问的是哪个应用程序里的表。
- 在得到了内容URI字符串之后,我们还需要将它解析成Uri对象才可以作为参数传入。解析的方法也相当简单,代码如下所示:
- `Uri uri = Uri.parse(“content://com.example.app.provider/table1”)
- 只需要调用Uri.parse()方法,就可以将内容URI字符串解析成Uri对象了。`
内容提供者使用
- 使用自带的内容提供者
- 手机通讯录、相册、短信等
- 注意:Uri 已有CONTENT_URI常量 使用Uri.parse()方法解析出来的结果。
- 创建自己的内容提供者
- 访问其他APP的数据:
- ①获取该应用的内容URI
- ②借助ContentResolver进行CRUD操作;
- 访问其他APP的数据:
Q1: APP 是如何提供外部访问接口的应用程序是如何实现的?
Q2: 如何保证数据的安全性?
创建内容提供者的步骤
- 新建一个类去继承ContentProvider的方式 创建自己的内容提供者;
- ContentProvider类中有六个抽象方法,使用子类继承,需全部重写6个方法;