• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 使用ContentProvider访问非数据库数据

使用ContentProvider访问非数据库数据

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了contentprovider,contentprovider详解,contentprovider实例,安卓contentprovider,no content provider等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

使用ContentProvider访问非数据库数据


一般情况我们使用ContentProvider主要访问数据库数据,但有时也可能需要访问非数据库数据,如XML或者本地数据,那就需要做一下特殊处理
最主要的是需要自定义Cursor,因为ContentProvider的query方法,只能返回Cursor引用。直接上代码,咱们边看边说

  1. public class MyContentProvider extends ContentProvider {

  2. //操作URI的类
  3. public static final UriMatcher uriMatcher;
  4. //为UriMatcher添加自定义的URI
  5. static{
  6. uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  7. uriMatcher.addURI(ProviderConstant.AUTHORITIES,"/user",
  8. ProviderConstant.INCOMING_USER_COLLECTION);
  9. uriMatcher.addURI(ProviderConstant.AUTHORITIES,"/user/#",
  10. ProviderConstant.INCOMING_USER_SINGLE);
  11. }

  12. private HashMap> allDatas= new HashMap>();


  13. private MyCursor cursor;

  14. public MyContentProvider(){
  15. cursor = new MyCursor();
  16. loadAllData();
  17. }


  18. /**
  19. * 加载我们的数据信息
  20. */
  21. public void loadAllData(){
  22. allDatas.clear();
  23. for(int pos=0; pos < 5;pos++){//填充5个学生数据
  24. ArrayList dataList = new ArrayList<>();
  25. dataList.add(pos+"");//id
  26. dataList.add("name"+pos);//name
  27. allDatas.put(pos+"",dataList);
  28. }
  29. }

  30. /**
  31. * 删除数据
  32. */
  33. @Override
  34. public int delete(Uri uri, String selection, String[] selectionArgs) {
  35. System.out.println("delete");
  36. int count = 0;
  37. String id = getUserId(selection, selectionArgs);
  38. if(allDatas.containsKey(id)){
  39. allDatas.remove(id);
  40. count = 1;
  41. }
  42. return count;
  43. }

  44. /**
  45. * 数据库访问类型
  46. */
  47. @Override
  48. public String getType(Uri uri) {
  49. System.out.println("getType");
  50. //根据用户请求,得到数据类型
  51. switch (uriMatcher.match(uri)) {
  52. case ProviderConstant.INCOMING_USER_COLLECTION:
  53. return ProviderConstant.CONTENT_TYPE;
  54. case ProviderConstant.INCOMING_USER_SINGLE:
  55. return ProviderConstant.CONTENT_TYPE_ITEM;
  56. default:
  57. throw new IllegalArgumentException("UnKnown URI"+uri);
  58. }
  59. }

  60. /**
  61. * 插入数据
  62. */
  63. @Override
  64. public Uri insert(Uri uri, ContentValues values) {
  65. ArrayList data = new ArrayList<>();
  66. int id =values.getAsInteger(ProviderConstant.ID);
  67. String name = values.getAsString(ProviderConstant.NAME);
  68. data.add(id+"");
  69. data.add(name);
  70. allDatas.put(id+"", data);
  71. return uri;
  72. }

  73. /**
  74. * 创建ContentProvider时调用的回调函数
  75. */
  76. @Override
  77. public boolean onCreate() {
  78. System.out.println("onCreate");
  79. return true;
  80. }

  81. /**
  82. * 查询数据库
  83. */
  84. @Override
  85. public Cursor query(Uri uri, String[] projection, String selection,
  86. String[] selectionArgs, String sortOrder) {
  87. //判断用户请求,查询所有还是单个
  88. switch(uriMatcher.match(uri)){
  89. case ProviderConstant.INCOMING_USER_COLLECTION:
  90. cursor.updateAllData(allDatas.values());
  91. break;
  92. case ProviderConstant.INCOMING_USER_SINGLE:
  93. String id = uri.getLastPathSegment();
  94. cursor.updateUserData(allDatas.get(id));
  95. break;
  96. }
  97. return cursor;
  98. }

  99. /**
  100. * 更新数据库
  101. */
  102. @Override
  103. public int update(Uri uri, ContentValues values, String selection,
  104. String[] selectionArgs) {
  105. System.out.println("update");
  106. String id = getUserId(selection, selectionArgs);
  107. int count=0;
  108. if(allDatas.containsKey(id)){
  109. String name = values.getAsString(ProviderConstant.NAME);
  110. //index取决于name所在的列
  111. allDatas.get(id).set(cursor.getColumnIndex(ProviderConstant.NAME), name);
  112. count = 1;
  113. }
  114. return count;
  115. }

  116. /**
  117. * 获取关键信息,用户ID
  118. * @param selection
  119. * @param selectionArgs
  120. * @return
  121. */
  122. private String getUserId(String selection, String[] selectionArgs){
  123. if(selectionArgs == null || selectionArgs.length == 0){
  124. //id 包含在selection里
  125. return selection.substring(selection.indexOf("=")+1).trim();
  126. }else{
  127. return selectionArgs[0];
  128. }
  129. }

  130. }
以上是自定义contentProvider,网上有很多例子和说明,不在详述,我们主要看一下query,我返回自定义Cursor。
其中用到了一些常量如下:
  1. public class ProviderConstant {
  2. //URI的指定,此处的字符串必须和声明的authorities一致
  3. public static final String AUTHORITIES = "com.zy.sports.app.MyContentProvider";

  4. //访问该ContentProvider的URI
  5. public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");

  6. //该ContentProvider所返回的数据类型的定义
  7. public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myprovider.user";
  8. public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.myprovider.user";


  9. //访问表的所有列
  10. public static final int INCOMING_USER_COLLECTION = 1;
  11. //访问单独的列
  12. public static final int INCOMING_USER_SINGLE = 2;


  13. public static final String ID = "id";
  14. public static final String NAME = "name";

  15. }



自定义Cursor的代码如下:

  1. public class MyCursor extends AbstractCursor{
  2. private static final String TAG = "MyCursor";

  3. private String[] columnNames= null;//构建cursor时必须先传入列明数组以规定列数

  4. /**
  5. * 数据区域
  6. */
  7. //所有的数据
  8. private ArrayList> allDatas= new ArrayList>();//在构造的时候填充数据,里层数据的size=columnNames.leng
  9. //当前一项的数据
  10. private ArrayList oneLineData= null;//onMove时填充

  11. public MyCursor(){
  12. //必须构建完整列信息
  13. columnNames = new String[]{"id","name"};
  14. }

  15. /**
  16. * 加载我们的数据信息
  17. */
  18. public void updateAllData(Collection> data){
  19. mPos = -1;
  20. allDatas.clear();
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 使用ContentProvider访问非数据库数据
  • Android之ContentProvider数据存储,contentprovider
  • ContentProvider域名替换小工具,contentprovider域名
  • ContentProvider中央档案馆,以及获取联系人电话的示例,contentprovider
  • (试笔)一、Android四大框架之ContentProvider的学习与运用,实现SQLite的增删改查。,安卓sqlite增删改查
  • Android中ContentProvider组件数据共享
  • 安卓第十四天笔记-内容提供者(ContentProvider),contentprovider

相关文章

  • 2017-05-26Android 关于“NetworkOnMainThreadException”,networkonmainthread
  • 2017-05-26Couldn&#39;t load libPassword from loader:NDK开发中C文件编译成cpu的so类库时,找不到类库报错的原因之一,libpasswordndk
  • 2017-05-26Android Facebook和Twitter分享
  • 2017-05-26include的用法例子,以及include+merge的用法例子,includemerge
  • 2018-11-27android studio开发控件布局
  • 2017-08-23Android下文件的压缩和解压(Zip格式)
  • 2017-05-26【同行说技术】Android程序员从小白到大神必读资料汇总(三),android资料汇总
  • 2017-05-26Linux内核系列—8.操作系统开发之时钟中断,linux内核
  • 2017-05-26Bottom Sheet
  • 2017-05-26自定义控件详解(二):Path类 相关用法,详解path

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android线程管理(三)&mdash;&mdash;Thread类的内部原理、休眠及唤醒,androidthread
    • JSON解析和XML解析对比,JSON解析XML解析
    • 手游项目总结,游项目总结
    • zabbix 2.4.7 升级到 3.2.4
    • android:从另外一个activity中返回数据
    • Android学习笔记(34):Android菜单
    • 实现在矩形框中输入文字,可以显示剩余字数的功能,矩形字数
    • XAMARIN.ANDROID SIGNALR 实时消息接收发送示例,xamarinsignalr
    • Android ListView onItemClick Not Work,androidonitemclick
    • Android 开源库和项目 3,android开源库项目

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有