Android学习笔记9 ContentProvider & Loader

来源:互联网 发布:网络舆情监控设备 编辑:程序博客网 时间:2024/06/08 14:03

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_URICallLog.Calls._ID       idCallLog.Calls.NUMBER    电话号码CallLog.Calls.DATE      日期CallLog.Calls.TYPE      类型
联系人
ContactsContract.Contacts.CONTENT_URIcom.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:排序方式

0 0
原创粉丝点击