本文来自:http://yaku2688.iteye.com/blog/1185364

ContentProvider数据共享

1.首先在AndroidManifest.xml文件中添加对外暴露的数据共享接口Content

Xml代码  
  1. <provider android:name=".UserProvider" android:authorities="com.yaku.ContentProvider.userprovider"/>

ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,authorities 就是他的域名

2.Url解析
content://com.yaku.ContentProvider.userprovider/user/2
【content://】 Android定义的内容提供都的Schema
【com.yaku.ContentProvider.userprovider】  主机名或者authorities
【user】  路径
【2】 ID

示例代码:

数据结构User.java:

Java代码  
  1. package com.yaku.pojo;
  2. public class User {
  3. private int id;
  4. private String name;
  5. private int age;
  6. public User(int id, String name, int age) {
  7. super();
  8. this.id = id;
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. @Override
  31. public String toString() {
  32. return "User [age=" + age + ", id=" + id + ", name=" + name + "]";
  33. }
  34. }

数据库操作DBOpenHelper.java:

Java代码  
  1. package com.yaku.db;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. public class DBOpenHelper extends SQLiteOpenHelper {
  6. private static final String DBNAME = "yaku.db"; //数据库名称
  7. private static final int DBVER = 1;//数据库版本
  8. public DBOpenHelper(Context context) {
  9. super(context, DBNAME, null, DBVER);
  10. }
  11. @Override
  12. public void onCreate(SQLiteDatabase db) {
  13. String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)";
  14. db.execSQL(sql);//执行有更改的sql语句
  15. }
  16. @Override
  17. public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
  18. db.execSQL("DROP TABLE IF EXISTS user");
  19. onCreate(db);
  20. }
  21. }

对外共享处理类ContentProviderUser.java:

Java代码  
  1. package com.yaku.ContentProvider;
  2. import com.yaku.db.DBOpenHelper;
  3. import android.content.ContentProvider;
  4. import android.content.ContentUris;
  5. import android.content.ContentValues;
  6. import android.content.UriMatcher;
  7. import android.database.Cursor;
  8. import android.database.sqlite.SQLiteDatabase;
  9. import android.net.Uri;
  10. public class ContentProviderUser extends ContentProvider {
  11. private DBOpenHelper dbOpenHelper;
  12. //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
  13. private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
  14. private static final int USERS = 1;
  15. private static final int USER = 2;
  16. static{
  17. //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1
  18. MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS);
  19. //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2
  20. MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符
  21. }
  22. @Override
  23. public int delete(Uri uri, String selection, String[] selectionArgs) {
  24. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  25. int count = 0;
  26. switch (MATCHER.match(uri)) {
  27. case USERS:
  28. count = db.delete("user", selection, selectionArgs);
  29. return count;
  30. case USER:
  31. //ContentUris类用于获取Uri路径后面的ID部分
  32. long id = ContentUris.parseId(uri);
  33. String where = "userid = "+ id;
  34. if(selection!=null && !"".equals(selection)){
  35. where = selection + " and " + where;
  36. }
  37. count = db.delete("user", where, selectionArgs);
  38. return count;
  39. default:
  40. throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  41. }
  42. }
  43. /**
  44. * 该方法用于返回当前Url所代表数据的MIME类型。
  45. * 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
  46. * 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
  47. */
  48. @Override
  49. public String getType(Uri uri) {
  50. switch (MATCHER.match(uri)) {
  51. case USERS:
  52. return "vnd.android.cursor.dir/user";
  53. case USER:
  54. return "vnd.android.cursor.item/user";
  55. default:
  56. throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  57. }
  58. }
  59. @Override
  60. public Uri insert(Uri uri, ContentValues values) {
  61. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  62. switch (MATCHER.match(uri)) {
  63. case USERS:
  64. long rowid = db.insert("user", "name", values);
  65. Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri
  66. this.getContext().getContentResolver().notifyChange(uri, null);
  67. return insertUri;
  68. default:
  69. throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  70. }
  71. }
  72. @Override
  73. public boolean onCreate() {
  74. this.dbOpenHelper = new DBOpenHelper(this.getContext());
  75. return false;
  76. }
  77. @Override
  78. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
  79. String sortOrder) {
  80. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  81. switch (MATCHER.match(uri)) {
  82. case USERS:
  83. return db.query("user", projection, selection, selectionArgs, null, null, sortOrder);
  84. case USER:
  85. long id = ContentUris.parseId(uri);
  86. String where = "userid = "+ id;
  87. if(selection!=null && !"".equals(selection)){
  88. where = selection + " and " + where;
  89. }
  90. return db.query("user", projection, where, selectionArgs, null, null, sortOrder);
  91. default:
  92. throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  93. }
  94. }
  95. @Override
  96. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
  97. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  98. int count = 0;
  99. switch (MATCHER.match(uri)) {
  100. case USERS:
  101. count = db.update("person", values, selection, selectionArgs);
  102. return count;
  103. case USER:
  104. long id = ContentUris.parseId(uri);
  105. String where = "userid = "+ id;
  106. if(selection!=null && !"".equals(selection)){
  107. where = selection + " and " + where;
  108. }
  109. count = db.update("user", values, where, selectionArgs);
  110. return count;
  111. default:
  112. throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
  113. }
  114. }
  115. }

单元测试类(在另一个应用中):

Java代码  
  1. package com.yaku.ContentProvider;
  2. import android.content.ContentResolver;
  3. import android.content.ContentValues;
  4. import android.database.Cursor;
  5. import android.net.Uri;
  6. import android.test.AndroidTestCase;
  7. import android.util.Log;
  8. /**
  9. * 对ContentProvider工程中的ContentProviderActivity进行单元测试
  10. */
  11. public class ContentProviderActivityTest extends AndroidTestCase {
  12. private static final String TAG = "ContentProvider";
  13. //往内容提供者添加数据
  14. public void testInsert() throws Throwable{
  15. ContentResolver contentResolver = this.getContext().getContentResolver();
  16. Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  17. ContentValues values = new ContentValues();
  18. values.put("name", "道长");
  19. values.put("age", 86);
  20. Uri uri = contentResolver.insert(insertUri, values);
  21. Log.i(TAG, uri.toString());
  22. }
  23. //更新内容提供者中的数据
  24. public void testUpdate() throws Throwable{
  25. ContentResolver contentResolver = this.getContext().getContentResolver();
  26. Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
  27. ContentValues values = new ContentValues();
  28. values.put("name", "青眉道长");
  29. contentResolver.update(updateUri, values, null, null);
  30. }
  31. //从内容提供者中删除数据
  32. public void testDelete() throws Throwable{
  33. ContentResolver contentResolver = this.getContext().getContentResolver();
  34. Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
  35. contentResolver.delete(deleteUri, null, null);
  36. }
  37. //获取内容提供者中的数据
  38. public void testFind() throws Throwable{
  39. ContentResolver contentResolver = this.getContext().getContentResolver();
  40. Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  41. Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
  42. while(cursor.moveToNext()){
  43. int id = cursor.getInt(cursor.getColumnIndex("userid"));
  44. String name = cursor.getString(cursor.getColumnIndex("name"));
  45. int age = cursor.getInt(cursor.getColumnIndex("age"));
  46. Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
  47. }
  48. }
  49. }

监听数据的变化:

Java代码  
  1. <span style="font-size: medium;">package com.yaku.ContentProvider;
  2. import android.content.ContentResolver;
  3. import android.content.ContentValues;
  4. import android.database.Cursor;
  5. import android.net.Uri;
  6. import android.test.AndroidTestCase;
  7. import android.util.Log;
  8. /**
  9. * 监听数据变化
  10. */
  11. public class OtherContentProviderTest extends AndroidTestCase {
  12. private static final String TAG = "OtherContentProvider";
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  18. ContentResolver contentResolver = this.getContentResolver();
  19. //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
  20. contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler()));
  21. }
  22. private final class PersonObserver extends ContentObserver{
  23. public PersonObserver(Handler handler) {
  24. super(handler);
  25. }
  26. @Override
  27. public void onChange(boolean selfChange) {
  28. ContentResolver contentResolver = getContentResolver();
  29. Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  30. Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
  31. while(cursor.moveToNext()){
  32. int id = cursor.getInt(cursor.getColumnIndex("userid"));
  33. String name = cursor.getString(cursor.getColumnIndex("name"));
  34. int age = cursor.getInt(cursor.getColumnIndex("age"));
  35. Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
  36. }
  37. }
  38. }
  39. }
  40. </span>

Android共享数据ContentProvider的使用相关推荐

  1. [转]Android共享数据ContentProvider的使用

    本文转自:http://yaku2688.iteye.com/blog/1185364 ContentProvider数据共享 1.首先在AndroidManifest.xml文件中添加对外暴露的数据 ...

  2. android 共享数据,android进程间共享简单数据

    我们知道,在android中,保存简单的数据最方便的就是使用SharedPreferences,然而,SharedPreferences虽然说也可以设置成进程间共享数据,但是并不可靠(更致命的是,不同 ...

  3. provider android简书,Android 使用ContentProvider在应用间共享数据

    Android 使用ContentProvider在应用间共享数据 题图 www.gratisography.com 在开发的过程中,有时会有需求要实现应用程序之间实现数据共享,在Android系统中 ...

  4. Android学习笔记---20_采用ContentProvider对外共享数据, UriMatcher类使用介绍 ,ContentUris类使用介绍,使用ContentResolver操作Conte

    20_采用ContentProvider对外共享数据 ------------------------------------------ 1.比如通讯录,就是通过ContentProvider,实现 ...

  5. android 应用间共享数据,调用其他app数据资源

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见:而我们可以使他们对其他的应用程序可见,可以通过Sha ...

  6. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)

             在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过Content Provider组件来实现.那么,Content Provide ...

  7. Android移动应用基础教程【使用内容提供者共享数据】

    本章目录 一.内容提供者概述 二.创建内容提供者 三.访问其他应用程序 1.查询其他程序的数据 2 .查询系统短信 四.内容观察者 1.什么是内容观察者 2.监测数据变化 五.本章小结 一.内容提供者 ...

  8. 使用 ContentProvider 共享数据 访问与添加通讯录

    1. 统一的数据访问方式 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据. 文件的操作模式中,通过指定文件的操作模式为Context.M ...

  9. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

最新文章

  1. 话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
  2. python【蓝桥杯vip练习题库】BASIC-28Huffuman树(贪心 Huffuman)
  3. Java字符串的十大问题
  4. python读取excel写入mysql pandas_python pandas 读取文件 写入文件excel
  5. java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
  6. 文字层一点就变红_学习观察神经网络:可视化整个模型训练中卷积层的激活
  7. python实现随机抽取答题_如何在python中实现随机选择
  8. html盒子模型子元素怎么水平占满父元素_立下flag)每日10道前端面试题18 关于【盒模型】十问...
  9. MySql Workbench表PK UN UQ B等字符的含义
  10. 排名算法(一)--PageRank
  11. 苹果Mac 桌面下方Dock 的App icon名称出现乱码怎么办?一个简单指令帮你解决
  12. AS技巧合集「常用技巧篇」
  13. 这些练习并没有多少用,但舍不得就扔了,作个记录吧。
  14. Linux网络嗅探工具,微软“雪藏”的七个Windows 10强力工具
  15. 未来杯总结1--cuda8.0+cuDnnv6+anavonda+tensorflow-gpu+keras+ubuntu16.04
  16. docker---dockerfile 编写优化
  17. rk键盘快捷键快捷键不一致_为什么其他键盘语言的键盘快捷键和可访问性很少起作用...
  18. BackTrack5(BT5)及BT5支持网卡列表
  19. 【智能医疗】人工智能通过模拟疾病进程可预测老年痴呆
  20. 关于51单片机按键防抖的一个思考

热门文章

  1. [译] 白雪公主如何帮助 Airbnb 证明在设计中最重要的技能是讲故事
  2. OA系统如何打造集团多业务管理平台
  3. C语言 使用指针遍历数组 - C语言零基础入门教程
  4. 牛客面试必考真题【算法篇】高频Top200 题目汇总
  5. pycharm 激活码使用
  6. ajax异步修改新闻状态,ajax同步刷新
  7. 区块链软件 NFT游戏开发对战游戏
  8. 动态口令卡(口令牌)原理解读
  9. 怎么在服务器里做一个金币系统,如何在Reworld里存储玩家的金币
  10. “京东金融”改名“京东数科”,这才是真实的京东金融梦