免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1280 | 回复: 0
打印 上一主题 下一主题

[转]较深入的分析Content Providers用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-16 17:13 |只看该作者 |倒序浏览
之前的教程(
Android平台上四种保存数据的方法
)中有讨论过Android平台上四种存储数据的方法以及需要着重注意的特性。Android严格控制了数据的安全使用规范,为此建立在各种存储模块中的数据依然是私有于其相对应的程序。有简单提及应用
Content Providers
来实现多个Applications共享数据,并没有深入讲解具体的执行过程。这个教程的目的就是对这个话题的延展,一步一步了解使用Content Providers的方法和规范。
一, 如何使用 Content Provider
Content Provider是专门用于数据存储的类,是Android平台处理存取数据操作的核心。针对不同的应用模块都有各自的Content provider总类,下边是用户经常接触到的几个典型Content Provider应用:
  • Content Provider Name : Intended Data
  • Browser : Browser bookmarks, Browser history, etc.
  • CallLog : Missed calls, Call datails, etc.
  • Contacts : Contact details
  • MediaStore : Media files such as audio, Video and Images
  • Settings : Device Settings and Preferences
    调用Content Provider资源的标准URI结构:
    :////
    例如:
    1) 取得浏览器所有“书签”信息: content://browser/bookmarks
    2) 取得系统通讯录中的信息: content://contacts/people (如果取得某一个特定通讯记录,在路径URI的末端指定一个ID号:content://contacts/people/5
    通过一个例子来具体的了解如何应用Content Provider调取资源:
    目的:访问Call Log数据池,读取所有与“呼叫”相关的记录信息
    步骤一,
    应用Eclipse作为开发IDE创建一个新的项目,根据自己的爱好来随意命名项目,例如这个例子的名字叫:“Hello_CP_Example”,
    步骤二,
    在文件AndroidManifest中添加 “READ_CONTACTS” permission标签:
    ?
    View Code
    XML android:name="android.permission.READ_CONTACTS">>
    步骤三,
    完成主程序源代码 :
    01.public class helloCP extends Activity {02.   /** Called when the activity is first created. */03.   @Override04.   public void onCreate(Bundle savedInstanceState) {05.      super.onCreate(savedInstanceState);06.      setContentView(R.layout.main);07. 08.      Uri allCalls = Uri.parse("
    content://call_log/calls
    ");09.      Cursor c = managedQuery(allCalls, null, null, null, null);10.      if (c.moveToFirst()) {11.         do{12.            String callType = "";13.            switch (Integer.parseInt(c.getString(14.              c.getColumnIndex(Calls.TYPE))))15.            {16.                  case 1: callType = "Incoming";17.                     break;18.                  case 2: callType = "Outgoing";19.                     break;20.                  case 3: callType = "Missed";21.            }22.            Log.v("AndroidRes CP",23.                  c.getString(c.getColumnIndex(Calls._ID)) + ", " +24.                  c.getString(c.getColumnIndex(Calls.NUMBER)) + ", " +25.                  callType) ;26.         } while (c.moveToNext());27.      }28.   }29.}
    • Uri allCalls = Uri.parse(”content://call_log/calls”); //定义访问Call_log的URI路径
    • ManagedQuery(); //将上边所得到的URI作为参数调用ManagedQuery()方法来取得Cursor,如果程序处于停止状态时将自动管理释放相关资源,系统重新启动后也将自动找回相关资源。这是一个管理资源的便捷方法。
      查看站内文档
      或者
      查看官方文档
    • Integer.parseInt(c.getString(c.getColumnIndex(Calls.TYPE))); //这个方法将返回代表呼叫类型的整型数值(1: Incoming Call; 2: Outgoing Call; 3: Missed Call;)

    步骤四,
    运行程序后,通过Eclipse中的DDMS可以看到当前的记录输出信息:
  • 04-16 17:49:18.399: VERBOSE/AndroidRes CP(222): 1, 1362×××0277, Incoming
  • 04-16 17:49:18.399: VERBOSE/AndroidRes CP(222): 2, 1362×××0277, Outgoing
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/85193/showart_1966200.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP