Provider端

  1. public class PersonProvider extends ContentProvider {
  2.  
  3. //用来存放所有合法的Uri的容器
  4. private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
  5. //保存一些合法的uri
  6. // content://com.atguigu.l09_provider.personprovider/person 不根据id操作
  7. // content://com.atguigu.l09_provider.personprovider/person/3 根据id操作
  8. static {
  9. matcher.addURI("com.atguigu.l09_provider.personprovider", "/person", 1);
  10. matcher.addURI("com.atguigu.l09_provider.personprovider", "/person/#", 2); //#匹配任意数字
  11. }
  12. private DBHelper dbHelper;
  13. public PersonProvider() {
  14. Log.e("TAG", "PersonProvider()");
  15. }
  16. @Override
  17. public boolean onCreate() {
  18. Log.e("TAG", "PersonProvider onCreate()");
  19. dbHelper = new DBHelper(getContext());
  20.  
  21. return false;
  22. }
  23.  
  24. /**
  25. * content://com.atguigu.l09_provider.personprovider/person 不根据id查询
  26. * content://com.atguigu.l09_provider.personprovider/person/3 根据id查询
  27. */
  28. @Override
  29. public Cursor query(Uri uri, String[] projection, String selection,
  30. String[] selectionArgs, String sortOrder) {
  31. Log.e("TAG", "PersonProvider query()");
  32.  
  33. //得到连接对象
  34. SQLiteDatabase database = dbHelper.getReadableDatabase();
  35.  
  36. //1.匹配uri, 返回code
  37. int code = matcher.match(uri);
  38. //如果合法, 进行查询
  39. if(code==1) {//不根据id查询
  40. Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, null);
  41. return cursor;
  42. } else if(code==2) {//根据id查询
  43. //得到id
  44. long id = ContentUris.parseId(uri);
  45. //查询
  46. Cursor cursor = database.query("person", projection, "_id=?", new String[]{id+""}, null, null, null);
  47. return cursor;
  48. } else {//如果不合法, 抛出异常
  49. throw new RuntimeException("查询的uri不合法");
  50. }
  51. }
  52.  
  53. /**
  54. * content://com.atguigu.l09_provider.personprovider/person 插入
  55. * content://com.atguigu.l09_provider.personprovider/person/3 根据id插入(没有)
  56. */
  57. @Override
  58. public Uri insert(Uri uri, ContentValues values) {
  59. Log.e("TAG", "PersonProvider insert()");
  60. //得到连接对象
  61. SQLiteDatabase database = dbHelper.getReadableDatabase();
  62. //匹配uri, 返回code
  63. int code = matcher.match(uri);
  64. //如果合法, 进行插入
  65. if(code==1) {
  66. long id = database.insert("person", null, values);
  67. //将id添加到uri中
  68. uri = ContentUris.withAppendedId(uri, id);
  69. database.close();
  70. return uri;
  71. } else {
  72. //如果不合法, 抛出异常
  73. database.close();
  74. throw new RuntimeException("插入的uri不合法");
  75. }
  76. }
  77.  
  78. /**
  79. * content://com.atguigu.l09_provider.personprovider/person 不根据id删除
  80. * content://com.atguigu.l09_provider.personprovider/person/3 根据id删除
  81. */
  82. @Override
  83. public int delete(Uri uri, String selection, String[] selectionArgs) {
  84. Log.e("TAG", "PersonProvider delete()");
  85. //得到连接对象
  86. SQLiteDatabase database = dbHelper.getReadableDatabase();
  87. //匹配uri, 返回code
  88. int code = matcher.match(uri);
  89. int deleteCount = -1;
  90. //如果合法, 进行删除
  91. if(code==1) {
  92. deleteCount = database.delete("person", selection, selectionArgs);
  93. } else if(code==2) {
  94. long id = ContentUris.parseId(uri);
  95. deleteCount = database.delete("person", "_id="+id, null);
  96. } else {
  97. //如果不合法, 抛出异常
  98. database.close();
  99. throw new RuntimeException("删除的uri不合法");
  100. }
  101.  
  102. database.close();
  103. return deleteCount;
  104. }
  105.  
  106. /**
  107. * content://com.atguigu.l09_provider.personprovider/person 不根据id更新
  108. * content://com.atguigu.l09_provider.personprovider/person/3 根据id更新
  109. */
  110. @Override
  111. public int update(Uri uri, ContentValues values, String selection,
  112. String[] selectionArgs) {
  113. Log.e("TAG", "PersonProvider update()");
  114. //得到连接对象
  115. SQLiteDatabase database = dbHelper.getReadableDatabase();
  116. //匹配uri, 返回code
  117. int code = matcher.match(uri);
  118. int updateCount = -1;
  119. //如果合法, 进行更新
  120. if(code==1) {
  121. updateCount = database.update("person", values, selection, selectionArgs);
  122. } else if(code==2) {
  123. long id = ContentUris.parseId(uri);
  124. updateCount = database.update("person", values, "_id="+id, null);
  125. } else {
  126. //如果不合法, 抛出异常
  127. database.close();
  128. throw new RuntimeException("更新的uri不合法");
  129. }
  130.  
  131. database.close();
  132. return updateCount;
  133. }
  134.  
  135. @Override
  136. public String getType(Uri uri) {
  137. // TODO Auto-generated method stub
  138. return null;
  139. }
  140. }
  1. <provider android:name="com.atguigu.l09_provider.PersonProvider"
  2. android:authorities="com.atguigu.l09_provider.personprovider"
  3. android:exported="true"/>
  4. <!-- exported : 是否可以让其它应用访问 -->

Resolver端

  1. /*
  2. * 通过ContentResolver调用ContentProvider插入一条记录
  3. */
  4. public void insert(View v) {
  5. //1. 得到ContentResolver对象
  6. ContentResolver resolver = getContentResolver();
  7. //2. 调用其insert
  8. Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
  9. //uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/3");
  10. ContentValues values = new ContentValues();
  11. values.put("name", "JACK");
  12. uri = resolver.insert(uri, values);
  13.  
  14. Toast.makeText(this, uri.toString(), 1).show();
  15. }
  16.  
  17. /*
  18. * 通过ContentResolver调用ContentProvider更新一条记录
  19. */
  20. public void update(View v) {
  21. //1. 得到ContentResolver对象
  22. ContentResolver resolver = getContentResolver();
  23. //2. 执行update
  24. Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
  25. ContentValues values = new ContentValues();
  26. values.put("name", "JACK2");
  27. int updateCount = resolver.update(uri, values, null, null);
  28.  
  29. Toast.makeText(this, "updateCount="+updateCount, 1).show();
  30. }
  31.  
  32. /*
  33. * 通过ContentResolver调用ContentProvider删除一条记录
  34. */
  35. public void delete(View v) {
  36. //1. 得到ContentResolver对象
  37. ContentResolver resolver = getContentResolver();
  38. //2. 执行delete
  39. Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
  40. int deleteCount = resolver.delete(uri, null, null);
  41. Toast.makeText(this, "deleteCount="+deleteCount, 1).show();
  42. }
  43.  
  44. /*
  45. * 通过ContentResolver调用ContentProvider查询所有记录
  46. */
  47. public void query(View v) {
  48. //1. 得到ContentResolver对象
  49. ContentResolver resolver = getContentResolver();
  50. //2. 调用其query, 得到cursor
  51. Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/1");
  52. uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
  53. Cursor cusor = resolver.query(uri, null, null, null, null);
  54. //3. 取出cursor中的数据, 并显示
  55. while(cusor.moveToNext()) {
  56. int id = cusor.getInt(0);
  57. String name = cusor.getString(1);
  58. Toast.makeText(this, id+" : "+name, 1).show();
  59. }
  60. cusor.close();
  61. }

contentprovider 实例的更多相关文章

  1. (Android) ContentProvider 实例

    ContentProvider 用于应用程序(Android Application)之间传递数据,包括Insert, update, delete, query. 下面的例子是在两个应用之间传递数据 ...

  2. 【Android】19.3 ContentProvider及安卓进一步封装后的相关类

    分类:C#.Android.VS2015: 创建日期:2016-03-08 一.简介 ContentProvider:内容提供程序. Android的ContentProvider与.NET框架的EF ...

  3. Android 进阶11:进程通信之 ContentProvider 内容提供者

    学习启舰大神,每篇文章写一句励志的话,与大家共勉. When you are content to be simply yourself and don't compare or compete, e ...

  4. Android面试收集录3 ContentProvider详解

    1.ContentProvider简单介绍 1.1.定义 ContentProvider,即内容提供者属于Android的四大组件之一. 1.2.作用 进程间进行数据交互&共享,即跨进程通信. ...

  5. Android ContentProvider 启动分析

    对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...

  6. Android开发-API指南-创建 Content Provider

    Creating a Content Provider 英文原文:http://developer.android.com/guide/topics/providers/content-provide ...

  7. 2.SDL规范文档

    01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...

  8. Android 技能图谱学习路线

    这里是在网上找到的一片Android学习路线,希望记录下来供以后学习 1Java 基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap ...

  9. ActivityThread 源码分析

    ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行) ...

随机推荐

  1. LeetCode OJ——Minimum Depth of Binary Tree

    http://oj.leetcode.com/problems/minimum-depth-of-binary-tree/ 贡献了一次runtime error,因为如果输入为{}即空的时候,出现了c ...

  2. django使用logging记录日志

    django使用logging记录日志,我没有用这方式去记录日志,主要还是项目小的原因吧, 有机会遇见大项目的话可以回头研究. 配置setting.py配置文件 import logging impo ...

  3. [Bzoj4942][Noi2017]整数(线段树)

    4942: [Noi2017]整数 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 237[Submit][Status][D ...

  4. CodeChef - RIN Course Selection

    Read problems statements in Mandarin Chineseand Russian. Rin is attending a university. She has M se ...

  5. 1.搭建maven,eclipse创建maven项目

    1.下载maven包,下载地址为:http://maven.apache.org/download.cgi 2.解压zip包 3.eclipse 引入maven: window-Preferences ...

  6. Java创建和解析Json数据方法(四)——json-lib包的使用

    (四)json-lib包的使用         既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中 ...

  7. IntelliJ IDEA出现Search for无法退出的问题

    说明: 1.这个不是安装了Vim导致的 解决方式: 1.可能是在不正确的系统时间启动的IDEA,然后启动完成后又把时间改成正确的. 2.直接方式是重启. 3.间接方式是修改完时间后再重启一下全部IDE ...

  8. Java中没有C#的out关键字,但可以通过数组实现类似的效果

    其实传递的就是数组的指针,里面的每一项的值还是那块内存,所以能直接操作里面的值.如果单纯传指定的值,那么里面操作的就是新的一块内存块. 用数组实现的效果如下: class B{ String cnt= ...

  9. EventBus3.0使用笔记.md

    事件总线这个其实没什么好说的,除了已经ondestroy的fragment或者activity不能接受外,只要定义了的都能接收消息 代码如下,需要注意的一点就是接收的监听事件必须用public修饰并且 ...

  10. 通过HTML5 FileReader实现上传图片预览功能

    原文:http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201706224590.html 在上传图片到服务器之前,我们希望可以预览一下要上传的图片. ...