您的位置:首页 > 移动开发 > Android开发

Android学习笔记9 ContentProvider & Loader

2015-10-15 10:21 591 查看

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)
:初始化Loader

onLoaderFinished(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)


Context
context

Uri
:数据库定位

projection
:要查询的行

selection
:条件语句

selectionArgs
:替换条件语句中的?

sortOrder
:排序方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: