博客
关于我
[android] 内容提供者实现
阅读量:656 次
发布时间:2019-03-15

本文共 3158 字,大约阅读时间需要 10 分钟。

Android内容提供者实现详解

内容提供者是Android系统中一个强大的工具,可以用来共享应用程序之间的数据。本文将详细讲解如何实现自己的内容提供者,并通过实例来说明如何操作。

内容提供者的基础知识

内容提供者允许不同的应用程序之间共享数据,避免了直接访问其他应用程序的数据库文件。通过内容提供者,可以定义自己的数据类型和访问方式,以实现数据的安全性和互信性。在 Android 中,内容提供者的核心组件是 ContentProvider,它暴露了几个重要的方法来处理数据操作,例如 queryinsertdeleteupdate 等。

一个典型的内容提供者的实现需要以下几个关键步骤:

  • 配置UriMatcher:定义如何匹配Uri请求,决定返回哪种操作。
  • 实现ContentProvider接口:通过覆盖相关方法(如 queryinsert 等)来处理数据操作。
  • 测试和验证:通过例子验证内容提供者的正确性。
  • UriMatcher的应用

    在内容提供者中,UriMatcher 是一个重要的工具,它用于解析请求的Uri,判断请求对应的操作类型,从而选择合适的处理方法。在实现内容提供者时,我们需要创建一个UriMatcher对象,并在 static代码块中添加规则。

    默认情况下,UriMatcher returns NO_MATCH (-1) 当没有找到匹配规则的时候。在我们的实现中,我们可以通过 addURI方法来定义规则:

    static {    matcher.addURI("com.tsh.database.personprovider", "insert", INSERT);    matcher.addURI("com.tsh.database.personprovider", "select", SELECT);    matcher.addURI("com.tsh.database.personprovider", "delete", DELETE);    matcher.addURI("com.tsh.database.personprovider", "update", UPDATE);}

    这里,"com.tsh.database.personprovider" 是我们的内容提供者的包名,"insert"、"select" 等是操作类型,各自对应一个常量(例如INSERT=1,SELECT=2等)。

    主要方法的实现

    内容提供者需要实现一些核心方法,主要有以下几个:

    1. onCreate()

    onCreate()方法中,我们会初始化数据库帮助类,比如 PersonSQLiteOpenHelper,以便后续操作数据库。

    @Overridepublic boolean onCreate() {    helper = new PersonSQLiteOpenHelper(getContext());    return false;}

    2. query()

    query()方法是用来处理数据查询的,这是内容提供者中最常用的操作。在这个方法中,我们需要做以下事情:

  • 使用UriMatcher匹配请求的Uri,判断操作类型。
  • 如果匹配成功,获取数据库的可读性数据库。
  • 调用数据库的查询方法,获取结果集,并返回。
  • @Overridepublic Cursor query(Uri uri, String[] projection, String selection,                    String[] selectionArgs, String sortOrder) {    if (matcher.match(uri) == SELECT) {        SQLiteDatabase db = helper.getReadableDatabase();        Cursor cursor = db.query("person", projection, selection,                selectionArgs, null, null, sortOrder);        return cursor;    }    return null;}

    3. getType()

    getType()方法是用来返回请求的数据类型的。这对于某些情况(如通知)来说很重要,有效类型会影响数据的处理方式。

    @Overridepublic String getType(Uri uri) {    return null;}

    4. insert()

    insert()方法用来将数据插入到数据库中。我们需要获取内容值(ContentValues),然后执行插入操作。

    @Overridepublic Uri insert(Uri uri, ContentValues values) {    return null;}

    5. delete()

    delete()方法用来删除数据。这需要一个有效的条件表达式和参数。

    @Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {    return 0;}

    6. update()

    update()方法用来修改数据。这需要一个可变的行记录和可变的更新参数。

    @Overridepublic int update(Uri uri, ContentValues values, String selection,                 String[] selectionArgs) {    return 0;}

    测试内容提供者的实现

    为了验证我们的内容提供者是否正常工作,我们可以编写一个测试应用,通过ContentResolver来查询和操作数据。

  • 获取ContentResolver
  • 在测试应用中,调用 getContentResolver() 方法,获取通用的内容解析器对象。

    ContentResolver resolver = getContentResolver();
    1. 解析Uri
    2. 使用Uri类的 parse() 方法将字符串解析为Uri对象。

      Uri uri = Uri.parse("content://com.tsh.database.personprovider/select");
      1. 执行查询
      2. 调用 query() 方法,传入所需的参数。

        Cursor cursor = resolver.query(uri, null, null, null, null);
        1. 处理结果
        2. 遍历结果集,并将数据打印出来。

          while (cursor.moveToNext()) {    String name = cursor.getString(cursor.getColumnIndex("name"));    System.out.println("name" + name);}cursor.close();

          注意事项

          在使用和实现内容提供者时,需要注意以下几点:

        3. 权限管理:确保内容提供者具有足够的权限操作数据库和文件。
        4. 安全性:遵守安全最佳实践,避免未经授权的访问。
        5. 兼容性:确保内容提供者的接口和方法与其他系统和应用兼容。
        6. 错误处理:在操作数据库时,处理可能出现的异常和错误。
        7. 总结

          通过以上步骤,我们可以实现一个基本的内容提供者,满足数据共享和访问的需求。在实际开发中,可能需要根据具体需求调整规则和数据库结构,同时注意性能和安全性。

    转载地址:http://ywnmz.baihongyu.com/

    你可能感兴趣的文章
    Nginx:NginxConfig可视化配置工具安装
    查看>>
    Nginx:现代Web服务器的瑞士军刀 | 文章末尾送典藏书籍
    查看>>
    ngModelController
    查看>>
    ngnix配置文件
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    NHibernate动态添加表
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    Nhibernate的第一个实例
    查看>>
    NHibernate示例
    查看>>
    nid修改oracle11gR2数据库名
    查看>>
    NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>