写给初学者19_android_四大组件_ContentProvider初级

来源:互联网 发布:winrar64解压软件下载 编辑:程序博客网 时间:2024/06/05 03:26

安卓19_四大组件-ContentProvider


这个组件其实要在你理解好安卓的数据储存方式以后,再来理解更好。安卓其他普通的数据储存方式几乎都只能用于处理自身的数据。比如Sqllite,但是一般我们的应用有一些数据可能来自系统,甚至有的时候需要两个应用之间进行数据共享。这个时候就需要ContentProvider了,它的主要用途是多个应用之间的数据共享。

官方定义

内容提供程序管理对结构化数据集的访问。它们封装数据,并提供用于定义数据安全性的机制。 内容提供程序是连接一个进程中的数据与另一个进程中运行的代码的标准界面。

基本理解

基本实现一个ContentProvider

public class MyContentProvider extends ContentProvider {/*初始化您的提供程序。Android 系统会在创建您的提供程序后立即调用此方法。请注意,ContentResolver 对象尝试访问您的提供程序时,系统才会创建它。 */@Overridepublic boolean onCreate() {    return false;}/** * 从您的提供程序检索数据。使用参数选择要查询的表、要返回的行和列以及结果的排序顺序。 将数据作为 Cursor 对象返回。 * @param uri 地址 * @param projection 行列 * @param selection 条件 * @param selectionArgs 满足条件的条目 * @param sortOrder 按照指定的排序方式排序 * @return */@Nullable@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {    return null;}/** *返回内容 URI 对应的 MIME 类型。实现内容提供程序 MIME 类型部分对此方法做了更详尽的描述。 * @param uri 地址 * @return *        1.多条 vnd.android.dir 开头 *        2.一条 vnd.android....item 开头 */@Nullable@Overridepublic String getType(Uri uri) {    return null;}/** * 在您的提供程序中插入一个新行。使用参数选择目标表并获取要使用的列值。 返回新插入行的内容 URI。 * @param uri 地址 * @param values 数据 * @return 插入行的内容 URI */@Nullable@Overridepublic Uri insert(Uri uri, ContentValues values) {    return null;}/** * 从您的提供程序中删除行。使用参数选择要删除的表和行。 返回已删除的行数。 * @param uri * @param selection 条件 * @param selectionArgs 满足条件条目 * @return */@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {    return 0;}/** * 更新您提供程序中的现有行。使用参数选择要更新的表和行,并获取更新后的列值。 返回已更新的行数。 * @param uri * @param values * @param selection * @param selectionArgs * @return */@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {    return 0;}}

要求实现的方法是比较多的。每个方法都有比较多的参数要求。这里需要经常熟悉API

访问系统当中电话簿

系统对联系人的处理,是存入了数据库中,你可以找到这个数据库。

其实系统对联系人的处理是数据库表,只不过表的结构非常复杂,也是出于安全性的考虑,这些表结构很复杂。所以一般选择使用系统的ContentProvider来进行访问

访问系统的东西,没有太多详细的说明。直接上代码

public class ContactManager {// 内容处理方案private ContentResolver cr;private Uri uri;private ArrayList<Contact> contacts;public ContactManager(Context context) {    // 不是直接通过系统的ContentProvider类 而是通过这个类简介的操作    this.cr = context.getContentResolver();    this.uri = Contacts.CONTENT_URI;    this.contacts = new ArrayList<>();    getAllContacts();}private void getAllContacts() {    // 查询到所有的联系人    Cursor all = this.cr.query(uri, new String[]{Contacts._ID,            Contacts.DISPLAY_NAME}, null, null, null);    if (all != null) {        while (all.moveToNext()) {            int id = all.getInt(all.getColumnIndex("_id"));            String phoneNumber = null, phoneType = null, email = null, emailType = null, displayName;            displayName = all.getString(all.getColumnIndex("display_name"));            // 根据id查询对应的手机号 和手机号类型            Cursor numberData = cr.query(Phone.CONTENT_URI, new String[]{                            Phone.NUMBER, Phone.TYPE},                    Phone.CONTACT_ID + "=" + id, null, null);            if (numberData != null) {                while (numberData.moveToNext()) {                    int type = numberData.getInt(numberData.getColumnIndex(Phone.TYPE));                    if (type == Phone.TYPE_HOME) {                        phoneType = "家庭电话";                    } else if (type == Phone.TYPE_MOBILE) {                        phoneType = "移动电话";                    } else {                        phoneType = "其他";                    }                    phoneNumber = numberData.getString(numberData.getColumnIndex(Phone.NUMBER));                }                numberData.close();// 需要关闭            }            // 根据联系人的ID去查询出联系人的邮箱地址 邮箱类型            Cursor emailData = cr.query(Email.CONTENT_URI, new String[]{                            Email.DATA, Email.TYPE}, Email.CONTACT_ID + "=" + id,                    null, null);            if (emailData != null) {                while (emailData.moveToNext()) {                    int type = emailData.getInt(emailData.getColumnIndex(Email.TYPE));                    if (type == Email.TYPE_WORK) {                        emailType = "工作邮箱";                    } else if (type == Email.TYPE_MOBILE) {                        emailType = "电话邮箱";                    } else if (type == Email.TYPE_HOME) {                        emailType = "家庭邮箱";                    } else {                        emailType = "其他类型";                    }                    email = emailData.getString(emailData.getColumnIndex(Email.DATA));                }                emailData.close();            }            Contact temp = new Contact(id, displayName, phoneType, phoneNumber, email, emailType);            this.contacts.add(temp);        }        all.close();    }}public ArrayList<Contact> getContacts() {    return this.contacts;}}

这里ContentResolver中的查询删除这些方法和ContentProvider的类中的查询等方法都是一致的。

当然你还可以访问日历,音乐等系统中的资源。

初学者只需要先学会简单的运用系统中的这些内容提供者,后期再慢慢开始让自己的应用共享,并且共享其他应用中的数据就好。

0 0
原创粉丝点击