- 数据共享
ContentProvider,这是一种不同应用之间共享数据的标准API:
当应用希望提供数据时,就提供Contentprovider
其他应用通过ContentResolver来操作
注意:
ContentProvider需要在AndroidManifest.xml中注册
一旦应用提供CP,不论应用启动与否,都可被操作
ContentProvider是单例模式的,多个ContentResolver请求数据时,是委托给同一个CP来操作的。 - URI
*Uri举例:content://org.edu.provider/words
content://:这部分是Android固定的
org.edu.provider:这部分是ContentProvider中的authority
words:资源部分,根据资源不同这部分不同*
通过Uri提供的静态方法parse()来实现将字符串转换为Uri
Uri uri = Uri.parse(“content://org.edu.p../words”) - 创建一个ContentProvider的步骤
定义自己的类继承ContentProvider类
boolean onCreate()
Uri insert(uri, values)
int delete(uri, selection, selectionargs)
int update(uri, values, selection, selectionargs)
Cursor query(uri, values,selection,selectionargs,sortorder)
String getType(uri)
向Android系统注册ContentProvider
<provider android:name="“android:authorities=""></provider>
- 应用通过ContentResolver操作CP暴漏的数据
获得ContentResolver的方法:
Content.getContentResolver()
通过ContentResolver操作数据:
insert(uri, values)
delete(uri , where , selectionargs)
update(uri, values , where ,selectionargs)
query(uri,projection, selection ,selectionargs,order)
- 操作URI的工具类
ContentUris
withAppendedId(uri,id):用于为路径加上ID部分
Uri uri = Uri.parse("content://com.test.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 5);
//生成后的Uri为:content://com.test.provider.personprovider/person/5
parseId(uri):用于从路径中获取ID部分
Uri uri = Uri.parse("content://com.test.provider.personprovider/person/5")
long personid = ContentUris.parseId(uri);//获取的结果为:5
确定ContentProvider匹配的Uri:UriMatcher
void addURI(authority, path , code):添加需要匹配的uri
int match(uri): 如果匹配就会返回匹配码
- 监听ContentProvider的数据变化
自定义类继承ContentObserver类,重写onChange方法,也就是当CP数据改变后的回调方法
通过ContentResolver向Uri注册ContentObserverregisterContentObserver(uri,notifyForDescendents, observer)
Uri:该监听器所监听的CP的Uri
notifyForDescendents:是否监听子Uri数据改变
observer:监听器实例