博客
关于我
[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/

    你可能感兴趣的文章
    mysql deadlock found when trying to get lock暴力解决
    查看>>
    MuseTalk如何生成高质量视频(使用技巧)
    查看>>
    mutiplemap 总结
    查看>>
    MySQL DELETE 表别名问题
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>
    mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
    查看>>
    Mysql group by
    查看>>
    MySQL I 有福啦,窗口函数大大提高了取数的效率!
    查看>>
    mysql id自动增长 初始值 Mysql重置auto_increment初始值
    查看>>
    MySQL in 太多过慢的 3 种解决方案
    查看>>
    MySQL InnoDB 三大文件日志,看完秒懂
    查看>>
    Mysql InnoDB 数据更新导致锁表
    查看>>
    Mysql Innodb 锁机制
    查看>>
    MySQL InnoDB中意向锁的作用及原理探
    查看>>
    MySQL InnoDB事务隔离级别与锁机制深入解析
    查看>>
    Mysql InnoDB存储引擎 —— 数据页
    查看>>
    Mysql InnoDB存储引擎中的checkpoint技术
    查看>>
    Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
    查看>>