`
huaxin803
  • 浏览: 109150 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 内容提供器---创建内容提供器(实现ContentProvider类)

 
阅读更多
ContentProvider对象实例通过处理来之其他应用程序的请求来管理对结构化数据集的访问。最终调用ContentResolver对象的所有的访问形式,都会对应ContentProvider类的具体方法。

必要的方法

抽象类ContentProvider定义了六个抽象方法,你必须在你自己具体的子类中来实现这些方法。这些方法中除了onCreate()以外,都用于视图访问你的内容提供的客户端应用程序调用。

query()

从提供器中获取数据,使用参数对选择的表进行查询,返回行和列的值,并且对结果进行排序。以Cursor对象的形式返回的数据。

insert()

把一行新的数据插入到提供器中。使用参数来选择目的表并获得参数中要使用的列值。返回最新插入的行的内容资源标识。

update()

更新提供器中既存的行。使用参数来选择要更新表和行,并获得被更新的列的值。返回被更新的行数。

delete()

从提供器中删除行。使用参数来选择要删除的表和行,返回被删除的行数。

getType()

返回对应的内容资源标识的MIME类型。

onCreate()

初始化提供器,在系统创建提供器之后会立即调用这个方法。注意直到ContentResolver对象试着访问提供器时,这个提供器才被创建。

注意这些方法有与ContentResolver完全相同的方法签名。

实现这方法时应该考虑以下事情:

1. 所有的这些方法除了onCreate()以外,都能够同时被多线程调用,因此它们必须是线程安全的。有关多线程的学习,请看“进程和线程”。

2. 避免在onCreate()方法中做长时操作。直到实际需要的时候才初始化任务。有关原因会在“实现onCreate()方法”章节中进行更多的讨论。

3. 尽管你必须实现这些方法,但是你的代码除了返回预定的数据类型之外,不做任何事情。例如,你可能会想阻止其他应用程序把数据插入到某些表中,你能够通过这种方法忽略对insert()方法的调用,并且返回“0”。

实现query()方法

ContentProvider.query()方法必须返回一个Cursor对象,如果执行失败,就抛出一个异常。如果你正在使用一个SQLite数据库做为你的数据存储,你能够通过调用SQLiteDatabase类的一个query()方法,就能简单的返回Cursor对象。如果查询不到匹配的行,那么返回的Cursor对象的getCount()方法就会返回0。只有在查询过程期间发生了内部错误,你才应该返回null。

如果你不适用SQLite数据库做为数据存储,那么就要使用Cursor的一个具体子类。如,MatrixCursor类实现了每行是一个对象数组的游标,这个类用addRow()方法来添加新行。

记住,Android系统必须能够跨进程来传递异常。在处理的查询错误中,下列异常可用于进程间传递:

1. IllegalArgumentException(如果提供器收到一个无效的内容资源标识,可以选择抛出这个异常)

2. NullPointerException

实现insert()方法

insert()方法使用ContentValues参数中的值把一行新的数据添加到相应的表中。如果在ContentValues参数中没有列名,你可能是想要使用提供器代码或数据库模式来提供默认值。

这个方法应该返回新插入行的内容资源标识。使用withAppendedId()方法给这个新行追加一个_ID(或其他主键)值。

实现delete()方法

不要使用delete()方法从你的数据存储中物理的删除行。因为如果你的提供器使用了同步适配器,你就应该使用“delete”标识来标记要删除的行,而不是把完全的删除行。同步适配器会在从提供器中删除它们之前检查要删除的行,并且从服务端删除它们。

实现update()方法

Update()方法需要与insert()方法使用的相同的ContentValues参数,以及与delete()方法和query()方法相同的selection和selectionArgs参数。这种方法允许你在这些方法之间重用代码。

实现onCreate()方法

Android系统会在提供器启动时调用onCreate()方法。你只应该在这个方法中执行快速的初始任务,并且要把数据库的创建和数据的装载延迟到提供器接收到实际的数据请求之后。如果在你onCreate()方法中你执行了长时任务,会降低提供器的启动速度,从而降低提供器对其他应用程序的响应速度。

例如,如果你使用SQLite数据库,而且在onCreate()方法中创建了一个新的SQLiteOpenHelper对象,然后在首次打开数据时,创建SQL表。要做这项工作,首先调用getWritableDatabase()方法,它会自动的调用SQLiteOpenHelper.onCreate()方法。

以下两段代码演示了ContentProvider.onCreate()方法和SQLiteOpenHelper.onCreate()方法之间的交互。第一段代码时ContentProvider.onCreate()方法的实现。

public class ExampleProvider extends ContentProvider

    /*
     * Defines a handle to the database helper object. The MainDatabaseHelper class is defined
     * in a following snippet.
     */
    private MainDatabaseHelper mOpenHelper;

    // Defines the database name
    private static final String DBNAME = "mydb";

    // Holds the database object
    private SQLiteDatabase db;

    public boolean onCreate() {

        /*
         * Creates a new helper object. This method always returns quickly.
         * Notice that the database itself isn't created or opened
         * until SQLiteOpenHelper.getWritableDatabase is called
         */
        mOpenHelper = new SQLiteOpenHelper(
            getContext(),        // the application context
            DBNAME,              // the name of the database)
            null,                // uses the default SQLite cursor
            1                    // the version number
        );

        return true;
    }

    ...

    // Implements the provider's insert method
    public Cursor insert(Uri uri, ContentValues values) {
        // Insert code here to determine which table to open, handle error-checking, and so forth

        ...

        /*
         * Gets a writeable database. This will trigger its creation if it doesn't already exist.
         *
         */
        db = mOpenHelper.getWritableDatabase();
    }
}

以下代码时SQLiteOpenHelper.onCreate()方法的实现,而且包括了一个助手类:

// A string that defines the SQL statement for creating a table
private static final String SQL_CREATE_MAIN = "CREATE TABLE " +
    "main " +                       // Table's name
    "(" +                           // The columns in the table
    " _ID INTEGER PRIMARY KEY, " +
    " WORD TEXT"
    " FREQUENCY INTEGER " +
    " LOCALE TEXT )";
...
/**
 * Helper class that actually creates and manages the provider's underlying data repository.
 */
protected static final class MainDatabaseHelper extends SQLiteOpenHelper {

    /*
     * Instantiates an open helper for the provider's SQLite data repository
     * Do not do database creation and upgrade here.
     */
    MainDatabaseHelper(Context context) {
        super(context, DBNAME, null, 1);
    }

    /*
     * Creates the data repository. This is called when the provider attempts to open the
     * repository and SQLite reports that it doesn't exist.
     */
    public void onCreate(SQLiteDatabase db) {

        // Creates the main table
        db.execSQL(SQL_CREATE_MAIN);
    }
}

注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。

如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar


分享到:
评论

相关推荐

    ContentProvider服务端

    这个是一个ContentProvider的服务的代码类,实现了创建注册ContentProvider

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--内容提供者之短信的序列化对象读写 |--内容提供者之短信的获取与写入 |--内容提供者之联系人读写与批量操作 |--内容提供者之获取通话记录 |--内容提供者的定义 |--写入联系人信息 |--利用FinalHttp实现多线程断点...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Android编程之创建自己的内容提供器实现方法

    本文实例讲述了Android编程之创建自己的内容提供器实现方法。...前面已经提到过,如果想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentProvider 的方式来创建一个

    Android四种存储方式 sharedpreference,file,SQlite,contentprovider

    Android四种存储方式 sharedpreference,file,SQlite,contentprovider 实现创建数据库和表及增删改查

    android ContentProvider

    本例子演示了android的组件之一,数据提供者,提供多个应用之间数据的共享,本例子实现了单词本的创建,查询,修改,删除等功能,非常实用,希望对大家有用,谢谢!

    Android 自定义ContentProvider简单实例

    Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下。 要使用ContentProvider来操作数据,必须要有保存数据的场所。可以使用文件或SQLite数据库的方式来保存数据,通常使用SQLite...

    Android开发资料合集-World版!

    4.4.2、标题栏进度指示器 50 4.4.3、titleBar 高级实现方法(更美观) 51 4.4.4、获取标题栏和状态栏高度 57 4.4.5、标题栏显示简单的进度框 57 4.5、MENU 58 4.5.1、简单的代码 58 4.5.2、menu实现的两种方法 58 ...

    AndroidStudioDbModelGenerator:用于生成 Android Parcelable 和 ContentProvider DB 模型的 AndroidStudio 插件

    IntelliJ IDEA 插件,用于从具有字段的类生成 Android 兼容的数据库模型。 插件与 AndroidStudio 兼容。 它产生: Android Parcelable 实现 - 基于 SQL 表的数据库字段名称常量。 新字段与先前添加的字段按顺序...

    传智播客Android视频教程-课程源码.rar

    B.SQLiteOpenHelper自动创建数据库的原理实现 C.数据库版本变化 D.编写代码完成添删改查操作(两种实现方法) E.事务的实现 F.采用ListView实现数据列表显示 2> 采用ContentProvider对外共享数据 第四天 1> 往...

    Android入门到精通源代码.

    1.3.4 内容提供器(ContentProvider) 1.4 Android网上资源 第2章 搭建Android开发环境 2.1 Android开发环境要求 2.2 JDK的安装和配置 2.2.1 安装JDK 2.2.2 配置JDK 2.3 Android SDK的下载和安装 2.3.1 下载Android ...

    疯狂Android讲义源码

     9.3 实现ContentProvider 364  9.3.1 创建ContentProvider的步骤 364  9.4 监听ContentProvider的数据  改变 370  9.4.1 ContentObserver简介 370  9.5 本章小结 372  第10章 Service与Broadcast  第10章 ...

    精通ANDROID 3(中文版)1/2

    4.3 实现ContentProvider  4.4 练习图书提供程序  4.4.1 添加图书  4.4.2 删除图书  4.4.3 获取图书数量  4.4.4 显示图书列表  4.5 资源  4.6 小结  第5章 Intent  5.1 Android Intent基础知识 ...

    android 快捷方式的权限判断。

    里面的工具类是 通过 各自的实现来判断 华为,小米 oppo vivi等的应用是否 拥有快捷方式 的权限,如果没有的话,则需要去手动授权。

    Android应用开发详解

    Android 基本程序单元Activity,讲述了Android中重要组件Activity的创建、启动和生命周期等内容 第6章 Android组件之间的信使Intent Android 组件之间的信使Intent,讲述了Intent对象及其属性、Intent的实现策略和...

    Android基础教程

    9.6 实现ContentProvider 9.7 快速阅读指南 第10 章 利用OpenGL实现3D图形 10.1 理解3D图形 10.2 OpenGL简介 10.3 构建一个OpenGL程序 10.4 渲染场景 10.5 构建一个模型 10.6 光线、相机 10.7 动作 10.8 应用纹理 ...

    疯狂Android讲义源代码2

    第9章 使用ContentProvider实现数据共享 第10章 Service与Broadcast Receiver 第11章 多媒体应用开发 第12章 OpenGL与3D应用开发 第13章 Android的网络应用 第14章 管理Android手机桌面 第15章 传感器应用开发 第16...

    8天快速掌握Android教程源码

    15_采用Pull解析器解析和生成XML内容.avi 所在项目:xml 16_采用SharedPreferences保存用户偏好设置参数.avi 所在项目:SharedPreferences 17_创建数据库与完成数据添删改查.avi 所在项目:db 18_在SQLite中使用事务...

Global site tag (gtag.js) - Google Analytics