跨程序共享数据
来源:互联网 发布:网络广告创意图片 编辑:程序博客网 时间:2024/05/18 18:21
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 @Override22 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {23 return null;24 }25 26 /*27 根据传入的数据URI来返回相应的MIME类型28 */29 @Override30 public String getType(Uri uri) {31 return null;32 }33 /*34 添加数据35 uri 确定添加的是那一张表36 values 保存待添加的数据37 返回一条表示这条新记录的URI38 */39 @Override40 public Uri insert(Uri uri, ContentValues values) {41 return null;42 }43 /*44 删除数据45 selection 和 selectionArgs 删除那些行46 返回被删除的行数47 */48 @Override49 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 @Override60 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 @Override34 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; }}
- 跨程序共享数据
- 跨程序共享数据
- ContentProvider跨程序数据共享
- Android 跨程序共享数据
- Content Provider实现跨程序数据共享
- 跨程序共享数据,内容提供器
- Android 实现跨程序数据共享栗子
- Android学习(13)-跨程序共享数据
- 关于跨程序数据共享时碰到Permission Denial问题
- 第7章 跨程序共享数据,探究
- 跨程序共享数据,探究内容提供器
- 内容提供器(Content Provider)--跨程序共享数据
- 跨程序共享数据,探究内容提供器
- 内容提供者(Content Provider)--跨程序共享数据
- 跨程序共享数据——读取系统联系人
- 内容提供器(二 - 跨程序数据共享)
- 跨程序共享数据,探究内容提供器
- 第七章 跨程序共享数据-探究内容提供器
- java在web开发安全性方面的总结
- Mongodb与spring集成 实体映射
- PHP declare(ticks=N); 的作用(转多篇文章)
- Android 悬浮窗权限各机型各系统适配大全
- Android Room从入门到放弃
- 跨程序共享数据
- 文章标题
- Memcache的并发问题和利用CAS的解决方案
- 在ofbiz中从多个数据库获取数据
- Java获得汉字的二进制码
- 搭建redis集群
- 华为VRP命令行基础
- mysql导入大批量数据出现MySQL server has gone away的解决方法
- android TextView不用ScrollViewe也可以滚动的方法