博客
关于我
Android开发-API指南-创建 Content Provider
阅读量:454 次
发布时间:2019-03-06

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

Android内容提供者开发指南

创建一个功能完善的Android内容提供者(ContentProvider)是开发Android应用程序的重要技能之一。本文将详细介绍如何设计、实现和优化一个高效的内容提供者。

一、准备工作

在开始开发内容提供者之前,需要先完成以下准备工作:

  • 确定必要性

    创建内容提供者主要有以下几种场景:

    • 需要向其他应用程序提供复杂数据或文件。
    • 用户需要将本应用程序中的数据复制到其他应用程序。
    • 需要利用系统搜索机制提供自定义搜索建议项。

    如果仅在应用程序内部使用,内容提供者不一定需要使用SQLite数据库。

  • 深入理解内容提供者

    如果尚未明确开发目的,可以先阅读相关文章,以全面了解内容提供者的工作原理和实现方式。


  • 二、创建内容提供者的基本步骤

    按照以下步骤可以创建一个适合需求的内容提供者:

  • 设计数据存储形式

    内容提供者可以使用两种主要方式存储数据:

    • 文件数据:数据存放在文件中,如图片、音频、视频等。文件通常存放在应用程序的私有空间中,其他应用程序访问时,内容提供者会返回相应的文件句柄。
    • 结构化数据:数据存放在数据库、数组或类似结构中。常见的存储方式是使用SQLite数据库,但也可以使用其他持久化存储方式。
  • 设计内容提供者类

    创建一个继承自ContentProvider类的新类,该类将作为访问数据的入口。更多关于ContentProvider实现细节,请参考官方文档。

  • 定义权威、内容URI及数据列名称

    • 权威(Authority):权威字符串用于标识内容提供者的唯一名称。建议使用包名加上特定字符串作为权威,例如com.example.MyProvider
    • 内容URI:内容Uniform Resource Identifier(URI)用于标识内容提供者的数据。格式为content://<权威>/<路径>,其中路径可以是表名或具体数据行。
    • 数据列名称:定义数据表中的列名称,并确保这些列名称符合预期。
  • 设置权限(可选)

    如果需要控制数据访问,可以在<provider>元素中定义权限。权限可以控制整个内容提供者的读写,特定路径的读写,或者临时授权。


  • 三、内容URI设计

    内容URI是内容提供者数据访问的关键。其结构包括权威、路径和可选的记录ID。

  • 权威的设计

    权威字符串应基于应用程序的包名,例如com.example.MyApp.Provider

  • 路径的设计

    路径部分可以是表名或文件名,例如:

    • content://com.example.MyApp.Provider/table1:访问表table1的所有记录。
    • content://com.example.MyApp.Provider/table1/item1:访问table1中ID为item1的记录。
  • 内容URI匹配规则

    使用UriMatcher类将内容URI映射为整数值,便于在ContentProvider中处理不同操作。支持的通配符包括:

    • *:匹配任意长度的任意字符。
    • #:匹配任意长度的数字字符。
  • MIME类型的设置

    MIME类型用于指明数据的类型。例如:

    • 表单数据的MIME类型:text/plain
    • 图片文件的MIME类型:image/jpeg

  • 四、实现ContentProvider类

    ContentProvider类是内容提供者的核心,必须实现以下6个抽象方法:

  • query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

    返回一个游标,用于读取和显示数据。实现时可以使用SQLite的query()方法。

  • insert(Uri uri, ContentValues values)

    插入一条新记录。返回新记录的Content URI。

  • delete(Uri uri, String[] whereClause, String[] whereArgs)

    删除指定的记录。返回删除的记录数。

  • update(Uri uri, ContentValues values, String whereClause, String[] whereArgs)

    更新指定的记录。返回更新的记录数。

  • onCreate()

    Android系统会在创建内容提供者时调用此方法。用于初始化数据库、创建表等任务。

  • getMimeType(Uri uri)

    返回指定URI对应的MIME类型。


  • 五、合约(Contract)类

    合约类通过常量定义URI、字段名、MIME类型等元数据,确保内容提供者与其他应用程序之间保持一致性。合约类通常包含以下内容:

    public final class MyProviderContract {    public static final String AUTHORITY = "com.example.MyProvider";    public static final String TABLE_NAME = "mytable";    public static final String MIME_TYPE_IMAGE = "image/jpeg";}

    六、权限管理

    内容提供者的权限控制可以通过<provider>元素在AndroidManifest.xml中定义。权限可以控制整个内容提供者的读写,特定路径的读写,或者临时授权。


    七、Intent和数据访问

    应用程序通过发送Intent来访问内容提供者的数据。Intent通常包含以下信息:

    • 动作(Action):例如com.example.MyProvider.QUERY_DATA
    • 附加数据(Extras):用于传递查询参数或上下文信息。

    例如:

    Intent intent = new Intent(context, MyDataProviderActivity.class);intent.setAction("com.example.MyProvider.QUERY_DATA");intent.putExtra("query", "select * from mytable");startService(intent);

    通过以上步骤,可以创建一个功能完善的内容提供者。内容提供者不仅可以在本应用程序内部使用,还可以为其他应用程序提供数据服务。

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

    你可能感兴趣的文章
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现NMS非极大值抑制(附完整源码)
    查看>>
    Objective-C实现NMS非极大值抑制(附完整源码)
    查看>>
    Objective-C实现Node.Js中生成一个UUID/GUID算法(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现NQueen皇后问题算法(附完整源码)
    查看>>
    Objective-C实现number of digits解字符数算法(附完整源码)
    查看>>
    Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
    查看>>
    Objective-C实现numerical integration数值积分算法(附完整源码)
    查看>>
    Objective-C实现n个取m个数的组合算法(附完整源码)
    查看>>
    Objective-C实现N数理论(质素相关)算法(附完整源码)
    查看>>
    Objective-C实现n皇后问题算法(附完整源码)
    查看>>
    Objective-C实现O(E + V) 中找到 0-1-graph 中的最短路径算法(附完整源码)
    查看>>
    Objective-C实现OCR文字识别(附完整源码)
    查看>>
    Objective-C实现odd even sort奇偶排序算法(附完整源码)
    查看>>
    Objective-C实现ohms law欧姆定律算法(附完整源码)
    查看>>
    Objective-C实现P-Series algorithm算法(附完整源码)
    查看>>
    Objective-C实现page rank算法(附完整源码)
    查看>>
    Objective-C实现PageRank算法(附完整源码)
    查看>>
    Objective-C实现pancake sort煎饼排序算法(附完整源码)
    查看>>