之前的教程(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结构:

<standard_prefix>://<authority>/<data_path>/<id>

例如:
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标签:

<!-- Easy AdSenser V2.37 --><!-- Post[count: 2] --> ?[Copy to clipboard] View Code XML
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

步骤三,

完成主程序源代码 <Java>:

01. public class helloCP extends Activity { 02. /** Called when the activity is first created. */ 03. @Override 04. 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可以看到当前的记录输出信息:

  1. 04-16 17:49:18.399: VERBOSE/AndroidRes CP(222): 1, 1362×××0277, Incoming
  2. 04-16 17:49:18.399: VERBOSE/AndroidRes CP(222): 2, 1362×××0277, Outgoing

转载请署名文章来自Androidres.com,并于标题前注明“【转载】”

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  5. Android之自定义View的死亡三部曲之(Layout)
  6. Android(安卓)Barrier
  7. Android资源管理框架-------之总述(一)
  8. Android图片压缩——Luban鲁班压缩
  9. Android(安卓)RxJava操作符详解 系列:组合 / 合并操作符

随机推荐

  1. Android开发小技巧之对android颜色渐变(Gr
  2. Android使用HttpURLConnection进行POST请
  3. Android(安卓)studio从菜鸟到高手--第一
  4. scaleType / ScaleType
  5. Android核心分析 ---- 电话系统之GSMCall
  6. Android之短信窃听器
  7. MMS and SMS in android
  8. 消息处理机制 —Handler/Thread/Looper &
  9. Android一些经典的开源项目
  10. 六款值得推荐的android(安卓)开源框架