ContentProvider

ContentProvider

Content Provider 封装底层数据库 提供简洁、安全的跨应用数据共享操作 Android四大组件之一


ContentProvider作用:
1 ContentProvider提供了对底层数据存储方式的抽象。如底层使用了SQLite数据库,在用了ContentProvider封装后,即使你把数据库换成MongoDB,也不会对上层数据使用层代码产生影响
2 Android框架中的一些类需要ContentProvider类型数据。如果你想让你的数据可以使用在如SyncAdapter, Loader, CursorAdapter等类上,那么你就需要为你的数据做一层ContentProvider封装。
3 第三个原因也是最主要的原因,是ContentProvider为应用间的数据交互提供了一个安全的环境。它准许你把自己的应用数据根据需求开放给其他应用进行增、删、改、查,而不用担心直接开放数据库权限而带来的安全问题


ContentResolver
contentProvider之上再封装一层 用于访问contentProvider的数据 也可以增删查改


ContentObserver
当监听相应的URI的数据发生了变化,如数据表,行发生变化,会收到通知(notifychange())
相当于一个数据库触发器


通过URI(资源统一鉴定符)来区分不同的contentProvider

content:://Authority/Path/Id

Authority:自定义的授权标识
Path:表名
Id:id号 区分表中数据


使用:
通过继承contentProvider使用
记得去manifest.xml中注册
onCreate进行初始化 query insert update delete进行增删查改(写操作记得加上notifyChange()通知ContentObserver

ContentProvider的权限设置

 android:exported为true则其他应用可以访问 否则得与该应用的 sharedUserId一致才可以访问
android:readPermission 该provider的读权限的标识
android:writePermission 该provider的写权限标识
android:permission provider读写权限标识
android:grantUriPermissions 临时权限标识
android:multiprocess 若为false,则系统中只会存在一个provider实例 若为true 则允许别的应用创建相应ContentProvider实例,减少跨进程通信开销,但是这样得保证好数据准确与安全

注意:不是线程安全的 因此进行 增删改的时候 要处理好线程安全性
1 底层的SQLiteDatabase是默认线程安全的
2 给方法加synchronized修饰

别的应用使用:
通过 contentResolver

多进程对于ContentProvider的访问请求最终都会按照队列进入ContentProvider进程

对ContentResolver的请求会自动转发到相应的ContentProvider实例,并且只有在真正操作数据的时候才会去获取Provider

你可能感兴趣的:(android,android,数据存储)