ContentProvider & Loader
- ContentProvider 内容提供者
- Loader 异步加载
ContentProvider 内容提供者
ContentProvider组件的作用是使本应用中私有的数据库的数据可以被外界访问
- URI
- ContentResolver
- 自定义ContentProvider
- 常用内部数据库
Uri
用于android资源定位
//内部格式:
[Action]://{package}/[data]
ContentResolver
ContentResolver的作用是访问ContentProvider提供的内容
根据提供的参数对相应应用的数据库进行查询
主要方法:
Cursor ContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
- uri:数据库资源定位
- projection:要查询的行列表
- selection:条件语句(可包含?参数)
- selectionArgs:用于填充条件语句中的?
- sortOrder:排序规则
Uri ContentResolver.insert(Uri url, ContentValues values)
- Uri:数据库资源定位
- values:数据集合
- 返回值Uri:插入数据的定位Uri
int ContentResolver.update(Uri uri, ContentValues values, String where, String[] selectionArgs)
- Uri;数据库资源定位
- values:要更新的数据
- where:条件语句
- selectionArgs:用于填充条件语句中的问号
- 返回值int:更新的行数
int android.content.ContentResolver.delete(Uri url, String where, String[] selectionArgs)
- Uri:数据库资源定位
- where:条件语句
- selectionArgs:用于填充条件语句中的问号
- 返回值int:删除的行数
callUri = CallLog.Calls.CONTENT_URI;
columns = new String[] { CallLog.Calls._ID, CallLog.Calls.NUMBER,
CallLog.Calls.DATE, CallLog.Calls.TYPE };
// 使用ContentRessolver 访问拨号记录应用下的ContentProvider提供的数据库中表的数据
// 得到ContentResolver对象
ContentResolver contentResolver = getContentResolver();
// 查询资源,从Uri代表的表中进行查询
Cursor cursor = contentResolver.query(Uri, Columns, null, null,null);
自定义ContentProvider
有数据库是前提
流程
- 继承ContentProvider
- 声明ContentProvider
- 定义数据表标识CODE
- 为数据表初始化Uri
- 重写数据库操作方法
- 在AndroidManifest中注册组件
- 在AndroidManifest中注册权限
- 在AndroidManifest中声明权限
声明ContentProvier
//声明该ContentProvider的唯一标识--通常使用包名+数据库名--必须小写
public static final String AUTHORITY ="xxx";
定义数据表标识
//为该组件中可以被外界访问的数据库中的资源定义Code标识
public static final int CODE_USER = 1;
public static final int CODE_ORDER = 8;
初始化数据表Uri
使用
UriMatcher产生并存储Uri
在静态代码块中实现初始化
使用int UriMatcher.match(Uri)对传进的Uri进行匹配,返回值为Uri对应数据表的CODE
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "user", CODE_USER);
uriMatcher.addURI(AUTHORITY, "order", CODE_ORDER);
}
int code = uriMatcher.match(uri);
重写数据库操作方法
这些方法供ContentResolver调用
参数也由其提供
query() insert() update() delete()
注册
<!-- 声明访问该组件的权限 -->
<permission android:name="com.qianfeng.gp08_day25_contentprovider1.READ_WRITE"/>
<!-- 使用该组件的权限 -->
<uses-permission android:name="com.qianfeng.gp08_day25_contentprovider1.READ_WRITE"/>
<!-- 注册 ContentProvider组件
android:authorities:声明该组件的唯一标识
android:permission:声明该组件的权限
android:exported="true":声明该组件可以被外界应用访问
-->
<provider
android:name="com.qianfeng.gp08_day25_contentprovider1.contentprovider.UserContentProvider"
android:authorities="com.qianfeng.gp08_day25_contentprovider1.users"
android:permission="com.qianfeng.gp08_day25_contentprovider1.READ_WRITE"
android:exported="true"
/>
常用数据库
通话记录
CallLog.Calls.CONTENT_URI
CallLog.Calls._ID id
CallLog.Calls.NUMBER 电话号码
CallLog.Calls.DATE 日期
CallLog.Calls.TYPE 类型
联系人
ContactsContract.Contacts.CONTENT_URI
com.android.providers.contacts/database/contacts2.db
联系人信息表:raw_contacts(_id,display_name.display_name_alt)
联系人数据表:data(_id,raw_contact_id(外键),data1,data2....data15,mimetype_id(数据类别外键))
数据类别表:mimetypes(_id,mimetype)
Loader 异步加载
实现方法
- Activity或Fragment实现LoaderCallbacks,同时指定最后加载的结果(泛型)
- Activity或Fragment实现LoaderCallbacks中的回调方法
关键方法
回调方法均由主线程(UI)执行
onCreatLoader(int id,Bundle args):初始化LoaderonLoaderFinished(Loader<?> loader,? data):异步任务完成后回调onLoaderReset(Loader<?> loader):重置Loader时回调
//使用:
getLoaderManager().initLoader(...);
getLoaderManager().restartLoader(...);
CursorLoader
处理数据库查询任务的Loader,返回值查询结果的游标数据集Cursor
CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
ContextcontextUri:数据库定位projection:要查询的行selection:条件语句selectionArgs:替换条件语句中的?sortOrder:排序方式
本文介绍了Android中的ContentProvider和Loader。ContentProvider用于共享应用程序的私有数据,涉及Uri、ContentResolver及其主要方法,以及自定义ContentProvider的流程。Loader则提供异步加载数据的能力,重点讲解了CursorLoader的使用。
407

被折叠的 条评论
为什么被折叠?



