android--创建自己的内容提供器

想要实现跨程序共享数据需要用到内容提供器,内容提供器给别的应用提供了访问接口,可以新建一个类去继承ContentProvider来创建一个自己的内容提供器。ContentProvider类中有6种抽象方法,在使用子类继承的时候需要全部重写。

 1 public class Myprovider extends ContentProvider {
 2
 3     @Override
 4     /*
 5     初始化时调用
 6     通常会在这里完成对数据库的创建和升级等操作,返回true表示初始化成功。
 7     只有当存在ContentResolver尝试访问程序中的数据时,才会进行初始化。
 8      */
 9     public boolean onCreate() {
10         return false;
11     }
12
13     /*
14     查询数据
15     uri 确定查询的是那一张表
16     projection 查询那一列
17     selection 和 selectionArgs查询那些行
18     sortOrder 对结果进行排序
19     返回的数据存放在Cursor对象中
20      */
21     @Override
22     public Cursor query(Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String sortOrder) {
23         return null;
24     }
25
26     /*
27     根据传入的数据URI来返回相应的MIME类型
28      */
29     @Override
30     public String getType(Uri uri) {
31         return null;
32     }
33     /*
34     添加数据
35     uri 确定添加的是那一张表
36     values 保存待添加的数据
37     返回一条表示这条新记录的URI
38      */
39     @Override
40     public Uri insert(Uri uri,  ContentValues values) {
41         return null;
42     }
43     /*
44     删除数据
45     selection 和 selectionArgs 删除那些行
46     返回被删除的行数
47      */
48     @Override
49     public int delete(Uri uri,  String selection,  String[] selectionArgs) {
50         return 0;
51     }
52     /*
53     更新已有的数据
54     uri 确定更新的是那一张表
55     values 新数据
56     selection 和 selectionArgs 更新那些行
57     会返回更新的行数
58      */
59     @Override
60     public int update(Uri uri,  ContentValues values,  String selection,  String[] selectionArgs) {
61         return 0;
62     }
63
64 }

  一个标准的内容URI写法是这样的:

  content://com.example.app.providder/table1

  这就表示想要访问com.example.app这个应用中的table1表中的数据

  content://com.example.app.providder/table1/1

  这表示想要访问com.example.app这个应用中的table1表中的id为1的数据

  content://com.example.app.providder/*

  这表示想要访问com.example.app这个应用中的任意表

  content://com.example.app.providder/table1/#

  这表示想要访问com.example.app这个应用中的table1表中的任意行的数据

  其中 * 表示任意长度的任意字符  # 表示任意长度的数字

  然后使用UriMatcher这个类实现匹配内容URI的功能,UriMatcher中有一个addURI()的方法,3个参数,可以分别把authority、path、和一个自定义代码,当调用UriMatcher的match()方法是,将一个URI传入,返回值某个能够匹配这个URI的自定义代码。

  修改后的代码:

  

 1 public class Myprovider extends ContentProvider {
 2
 3     //用于识别URI的自定义代码
 4     public static final int TABLE1_DIR = 0;
 5
 6     public static final int TABLE1_ITEM = 1;
 7
 8     public static final int TABLE2_DIR = 2;
 9
10     public static final int TABLE2_ITEM = 3;
11
12     //创建UriMatcher的实例
13     private static UriMatcher uriMatcher;
14
15     //将自定义代码和希望的URI匹配
16     static {
17         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
18         uriMatcher.addURI("xbt.exp11.provider","table1",TABLE1_DIR);
19         uriMatcher.addURI("xbt.exp11.provider","table1/#",TABLE1_ITEM);
20         uriMatcher.addURI("xbt.exp11.provider","table2",TABLE2_DIR);
21         uriMatcher.addURI("xbt.exp11.provider","table2/#",TABLE2_ITEM);
22
23     }
24     ...
25     /*
26     查询数据
27     uri 确定查询的是那一张表
28     projection 查询那一列
29     selection 和 selectionArgs查询那些行
30     sortOrder 对结果进行排序
31     返回的数据存放在Cursor对象中
32      */
33     @Override
34     public Cursor query(Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String sortOrder) {
35
36         //判断希望被访问的数据是什么数据
37         switch (uriMatcher.match(uri)){
38             case TABLE1_DIR:
39                 //查询table1表中的所有数据
40                 break;
41             case TABLE1_ITEM:
42                 //查询table1表中的单条数据
43                 break;
44             case TABLE2_DIR:
45                 //查询table2表中的所有数据
46                 break;
47             case TABLE2_ITEM:
48                 //查询table2表中的单条数据
49                 break;
50             default:
51                 break;
52         }
53         ...
54     }
55
56     ...
57
58 }

  insert()、update()、delete()也可以使用switch (uriMatcher.match(uri)){..}这样的判断语句判断出希望访问的是那张表,再进行相应的操作

  getType()方法是一个所有的内容提供器都必须提供的一个方法,用于获取Uri对象所对应的MIME类型。

  一个内容URI所对应的MIME字符串主要由3部分组成,android的格式规定是:

  1、必须以vnd开头

  2、如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/

  3、最后接上vnd.<authority>.<path>

  所以,对于content://com.example.app.providder/table1这个内容URI,它所对应的MIME类型就可以写成:

  vnd.android.cursor.dir/vnd.example.app.providder.table1

  对于content://com.example.app.providder/table1/1这个内容URI,它所对应的MIME类型就可以写成:

  vnd.android.cursor..item/vnd.example.app.providder.table1

  实现getType()方法的逻辑如下:

public class Myprovider extends ContentProvider {

...

    /*
    根据传入的数据URI来返回相应的MIME类型
     */
    @Override
    public String getType(Uri uri) {

        switch (uriMatcher.match(uri)){
            case TABLE1_DIR:
                return "vnd.android.cursor.dir/vnd.xbt.exp11.provider.table1";
            case TABLE1_ITEM:
                return "vnd.android.cursor.item/vnd.xbt.exp11.provider.table1";
            case TABLE2_DIR:
                return "vnd.android.cursor.dir/vnd.xbt.exp11.provider.table2";
            case TABLE2_ITEM:
                return "vnd.android.cursor.item/vnd.xbt.exp11.provider.table2";
            default:
                break;
        }
        return null;
    }
}
时间: 2024-12-13 14:43:42

android--创建自己的内容提供器的相关文章

Android内容提供器——创建自己的内容提供器

创建自己的内容提供器很简单,只需要新建一个类继承ContentProvider类,并重写其中的6个抽象方法即可.(需要全部重写) 一 URI的写法 一个标准的内容URI写法有两种: 1.路径结尾,表示访问表中所有内容: content://com.example.app.provider/table1 // * 可以代表任意长度的任意字符,所以也可以写成下面这样 content://com.example.app.provider/* 2.id结尾,表示访问表中特定id的内容: content:

android学习十二(android的Content Provider(内容提供器)的使用)

文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中访问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性.目前使用内容提供器是android实现跨程序共享数据的标准方式.内容提供器可以选择只对一部分数据进行共享,从而保证我们的程序中的隐私数据不会有泄漏的风险. 内容提供器的用法一般有两种,一种是使用现有的内容提

android笔记 : Content provider内容提供器

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能. 内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口. 第一种方法:使用ContentResolver来读取和操作相应程序中的数据 1.用parse方法将内容 URI 字符串解析成 Uri 对象. uri(Uniform Resource identifier)指的是统一资源标识符Uri uri = Uri .

Android入门(十四)内容提供器-实现跨程序共享实例

原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的提示去除掉,因为跨程序访问时我们不能直接使用 Toast.然后添加一个 DatabaseProvider类,代码如下所示: package ga.orlion.databasedemo; import android.content.ContentProvider; import android.c

【练习】内容提供器二、创建自己的内容提供器并测试

1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不同的软件之间数据共享,提供统一的接口.也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件.数据库内存储的信息.当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Andro

Android入门(十三)内容提供器

原文链接:http://www.orlion.ga/612/ 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.目前,使用内容提供器是 Android实现跨程序共享数据的标准方式.内容提供器的用法一般有两种, 一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口. 一.访问其他程序中的数据 Andro

android: 内容提供器简介

我们学了 Android 数据持久化的技术,包括文件存储.SharedPreferences 存 储.以及数据库存储.不知道你有没有发现,使用这些持久化技术所保存的数据都只能在当 前应用程序中访问.虽然文件和 SharedPreferences 存储中提供了 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种操作模式,用于供给其他的应用程序访问当前应用 的数据,但这两种模式在 Android 4.2 版本中都已被废弃了.为什么呢?因为 Android 官

Android组件----内容提供器Content Provider

内容提供器(Content Provider)主要用于在不同的应用程序之间共享数据,虽然Android提供的文件存储和SharePreferences都可以设置全局读写模式共享数据,但由于安全性问题,已经在Android4.2中被废弃.内容提供器将提供一种安全的数据共享方式.当一个程序通过内容提供器提供了外部访问接口,其他任何程序都可以通过该接口来对这部分数据进行访问,例如:联系人数据,短信数据. 一.访问其他应用程序中的数据 1 . 获得ContentResolver类的实例 对于每一个应用程

入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性,目前,使用内容提供器是Android实现跨程序共享数据的标准方式. 在正式学习内容提供器之前,我们需要先掌握另外一个非常重要的知识--Android运行时权限,因为 在学习内容提供器时,我们会用到这方面的知识.另外运行时权限的知识在以后我们的开发过程中还会经常的涉

android第一行代码-9.内容提供器

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 内容提供器包括两部分:使用现有的内容提供器来读取和操作相应程序中的数据跟创建自己的内容提供器给我们程序的数据提供外部访问接口. 1.使用现有的内容提供器来读取和操作相应程序中的数据 想要访问内容提供器中共享的数据,就一定要借助ContentResolver.可以通过 Context 中的 getContentResolver()方法获取到该类的实例.ContentResolver 中提供了一系列的方法