ContentProvider

时间过得真快, 上一篇关于 ContentProvider 的笔记还是 2015 年的时候, 之后就没有用过 ContentProvider 了, 有些东西都忘了, 而且关于自定义 ContentProvider 和 greendao 的内容比较少, 这里再重新整理一遍;
这里使用 greendao 框架存储数据, 不同点就是 SQLiteDatabase 对象是通过 greendao 提供的 getWritableSQLiteDatabase 方法来获取到的;

正文

继承 ContentProvider, 来实现跨进程的数据库访问; 继承的子类需要在 AndroidManifest.xml 中进行配置;

  • android:exported 是否可由其它应用调用
  • android:name 子类的路径
  • android:authorities 自定义的 uri

下面的例子中实现了一个查询:

使用 ContentResolver 调用自定义 ContentProvider 提供的方法

获取ContentResolver对象:
Context调用getContentResolver()方法返回ContentResolver对象


通过该对象调用insert,delete,update,query等方法
调用方法的第一个参数(Uri)为 ContentProvider 注册配置时的Uri。
例:getContentResolver().insert( Uri . parse( "content://com.mxguo.contact.cp" ),contentValue);
ContentResolver对象调用方法,事实上对应调用的是该Uri对应的ContentProvider中的对应方法

使用 ContentObserver 监听 ContentProvider 对应数据的改变

自定义 ContentObserver 的子类响应 ContentProvider 的变化;

注册变化监听

通知 ContentProvider 数据变化

notifyChange 之后, 对这个Uri注册了监听的 ContentObserver 的 onChange 方法将被回调;




补充 UriMatcher

用来判断接收到的 uri 是否包含在 UriMatcher 中预设的 uri 之中;

方法

  • addURI(String authority, String path, int code) 添加的 uri, 第三个参数 code 作为返回值 .match(uri) 的返回值
  • match(Uri uri) 匹配的话, 返回 code
Uri

Uri person = ContentUris.withAppendedId("content://contacts/people", 45);
等价 content://contacts/people/45
Uri 中的方法 String getLastPathSegment () 返回路径中的最后一个片段

0 Comments
Leave a Reply