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

知识的领域是无限的,我们的学习也是无限期的。这篇文章主要讲述android--创建自己的内容提供器相关的知识,希望能为你提供帮助。
想要实现跨程序共享数据需要用到内容提供器,内容提供器给别的应用提供了访问接口,可以新建一个类去继承ContentProvider来创建一个自己的内容提供器。ContentProvider类中有6种抽象方法,在使用子类继承的时候需要全部重写。

1 public class Myprovider extends ContentProvider { 2 3@Override 4/* 5初始化时调用 6通常会在这里完成对数据库的创建和升级等操作,返回true表示初始化成功。 7只有当存在ContentResolver尝试访问程序中的数据时,才会进行初始化。 8*/ 9public boolean onCreate() { 10return false; 11} 12 13/* 14查询数据 15uri 确定查询的是那一张表 16projection 查询那一列 17selection 和 selectionArgs查询那些行 18sortOrder 对结果进行排序 19返回的数据存放在Cursor对象中 20*/ 21@Override 22public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) { 23return null; 24} 25 26/* 27根据传入的数据URI来返回相应的MIME类型 28*/ 29@Override 30public String getType(Uri uri) { 31return null; 32} 33/* 34添加数据 35uri 确定添加的是那一张表 36values 保存待添加的数据 37返回一条表示这条新记录的URI 38*/ 39@Override 40public Uri insert(Uri uri,ContentValues values) { 41return null; 42} 43/* 44删除数据 45selection 和 selectionArgs 删除那些行 46返回被删除的行数 47*/ 48@Override 49public int delete(Uri uri,String selection,String[] selectionArgs) { 50return 0; 51} 52/* 53更新已有的数据 54uri 确定更新的是那一张表 55values 新数据 56selection 和 selectionArgs 更新那些行 57会返回更新的行数 58*/ 59@Override 60public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs) { 61return 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的自定义代码 4public static final int TABLE1_DIR = 0; 5 6public static final int TABLE1_ITEM = 1; 7 8public static final int TABLE2_DIR = 2; 9 10public static final int TABLE2_ITEM = 3; 11 12//创建UriMatcher的实例 13private static UriMatcher uriMatcher; 14 15//将自定义代码和希望的URI匹配 16static { 17uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 18uriMatcher.addURI("xbt.exp11.provider","table1",TABLE1_DIR); 19uriMatcher.addURI("xbt.exp11.provider","table1/#",TABLE1_ITEM); 20uriMatcher.addURI("xbt.exp11.provider","table2",TABLE2_DIR); 21uriMatcher.addURI("xbt.exp11.provider","table2/#",TABLE2_ITEM); 22 23} 24... 25/* 26查询数据 27uri 确定查询的是那一张表 28projection 查询那一列 29selection 和 selectionArgs查询那些行 30sortOrder 对结果进行排序 31返回的数据存放在Cursor对象中 32*/ 33@Override 34public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) { 35 36//判断希望被访问的数据是什么数据 37switch (uriMatcher.match(uri)){ 38case TABLE1_DIR: 39//查询table1表中的所有数据 40break; 41case TABLE1_ITEM: 42//查询table1表中的单条数据 43break; 44case TABLE2_DIR: 45//查询table2表中的所有数据 46break; 47case TABLE2_ITEM: 48//查询table2表中的单条数据 49break; 50default: 51break; 52} 53... 54} 55 56... 57 58 }

insert()、update()、delete()也可以使用switch (uriMatcher.match(uri)){..}这样的判断语句判断出希望访问的是那张表,再进行相应的操作
【android--创建自己的内容提供器】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; } }

 
 

    推荐阅读