`
byandby
  • 浏览: 1696041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android Content Provider的使用

阅读更多
    Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。

    Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 Content Provider, 这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。

   让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类)  或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model) 和 URI。
  
   1.数据模型
    Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。

   2.URI
    URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的公开URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的Content Provider 的URI 都以"content://" 开头,其中"content:"是用来标识数据是由Content Provider管理的 schema。

      在几乎所有的Content Provider 的操作中都会用到URI,因此一般来讲,如果是自己开发的Content Provider,最好将URI定义为常量,这样在简化开发的同时也提高了代码的可维护性。

      首先来介绍如何访问Content Provider中的数据,访问 Content Provider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对Content Provider 中的数据进行查询、插入、修改和删除等操作。 以查询为例,查询一个 Content Provider 需要掌握如下的信息。

      唯一标识Content Provider 的URI
      需要访问的数据字段名称。
      该数据字段的数据类型

  提示: 如果需要访问特定的某条数据记录,只需该记录的ID 即可。

    查询Content Provider的方法有两个:ContentResolver的query() 和 Activity 对象的 managedQuery(),二者接收的参数均相同,返回的都是Cursor 对象,唯一不同的是 使用managedQuery 方法可以让Activity 来管理 Cursor 的生命周期。

    被管理的Cursor 会在 Activity进入暂停状态的时候调用自己的 deactivate 方法自行卸载,而在Activity回到运行状态时会调用自己的requery 方法重新查询生成的Cursor对象。如果一个未被管理的Cursor对象想被Activity管理,可以调用Activity的 startManagingCursor方法来实现。
     
      下面通过一个例子来说明访问Content Provider的方式,本例中通过Content Resolver对象访问Android中存储了联系人信息的Content Provider并将数据显示到TextView上。
大家先来看一下我手机上都有哪些联系人吧,见下图。



下边我们就来看代码吧比较简单了,只有一个类Activity01
package xiaohang.zhimeng;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;

public class Activity01 extends Activity {
	//查询Content Provider时希望返回的列
	String [] columns = {
			ContactsContract.Contacts.DISPLAY_NAME,
			ContactsContract.Contacts._ID,
            //People._ID,
			//People.NAME
	};
	
	Uri contactUri = ContactsContract.Contacts.CONTENT_URI;
	TextView tv;
	//Uri contaUri = Contacts.People.CONTENT_URI;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView)findViewById(R.id.tv);
        String result = getQueryData();
        tv.setTextColor(Color.GREEN);
        tv.setTextSize(20.0f);
        tv.setText("ID\t名字\n" + result);
        
    }
    //获取联系人列表的信息,返回 String对象
    public String getQueryData(){
    	String result = "";
    	//获取ContentResolver对象
    	ContentResolver resolver = getContentResolver();
    	Cursor cursor = resolver.query(contactUri, columns, null, null, null);
    	//获得_ID字段的索引
    	int idIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID);
    	//获得Name字段的索引
    	int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    	//遍历Cursor提取数据
    	for (cursor.moveToFirst();(!cursor.isAfterLast());cursor.moveToNext()) {
			result = result + cursor.getString(idIndex) + "\t";
			result = result + cursor.getString(nameIndex)+ "\t\n";
		}
    	cursor.close();
    	return result;
    }
}


下面是运行后的效果



最后在提醒大家一下不要忘记加权限
<uses-permission android:name="android.permission.READ_CONTACTS" />


  测试平台 android2.0   源码见附件
  • 大小: 31.4 KB
  • 大小: 17.1 KB
分享到:
评论
2 楼 赵跃洲 2011-09-22  
谢谢你的分享!
1 楼 WinLi 2011-01-18  
<p>沙发!<br>不错哦。<br>要是一个联系人,有多个号码,就不能这样了。可以通过一下判断</p>
<div class="quote_title">
<pre name="code" class="java">int hasNumberColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
String count = cursor.getString(hasNumberColumnIndex);
</pre>
 </div>
<p> </p>

相关推荐

    android content provider示例程序(简单记账)

    7. **使用Content Resolver**:在其他应用中,可以通过Content Resolver来与Content Provider交互,如`ContentResolver.query()`、`ContentResolver.insert()`等。 这个示例程序可以帮助开发者理解Content Provider...

    Android Content Provider Demo

    本"Android Content Provider Demo"着重于演示如何创建和使用Content Provider来实现跨应用的数据共享。 Content Provider是Android系统提供的一种机制,允许应用程序暴露自己的数据给其他应用,或者获取其他应用...

    Android基础 Content Provider

    **Android基础 Content Provider** 在Android开发中,Content Provider是一个至关重要的组件,它充当了应用程序间数据共享的桥梁。本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、...

    android中Content Provider

    这篇博客《Android中Content Provider》将深入探讨这个关键组件的工作原理和使用方法。 Content Provider的基本结构包括两个主要部分:`ContentResolver`和`Provider`。`ContentResolver`是客户端(调用方)与`...

    android content provider

    【Android Content Provider】是Android系统中的一个重要组件,它主要用于在应用程序之间共享数据。Content Provider作为Android四大组件之一,为其他应用提供了访问私有数据的标准化接口。通过Content Provider,一...

    Android Content Provider用法样例.rar

    Android Content Provider用法样例,解析如何使用“内容提供商”Content Provider共享不同应用的数据,本Android例子将使用Content Provider实现了获取联系人信息,里面的注释非常丰富,是学习android的好资料。

    查看android.provider包中的uri内容

    在Android开发中,`android.provider`包是系统提供的一个核心包,主要用于与系统的各种内容提供者(Content Provider)进行交互。这些内容提供者是Android系统数据共享的关键组件,它们允许应用访问并操作如联系人、...

    android-simple-content-provider-app:简单的Android Content Provider使用示例

    本示例项目"android-simple-content-provider-app"是专门为初学者设计的,旨在讲解如何在Android应用程序中创建和使用一个基本的Content Provider。让我们深入探讨这个话题。 首先,Content Provider是Android系统...

    android 自定义 Content Provider示例

    在Android开发中,Content Provider是四大组件之一,它充当了数据共享和交换的桥梁,使得不同的应用程序之间可以安全地共享数据。本示例将详细解析如何自定义Content Provider,以便在Android应用间实现数据共享。 ...

    Android新手Content Provider获取通讯录,短信,通话记录

    理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。

    Android组件content provider使用解析

    Android 组件 Content Provider 使用解析 Content Provider 是 Android 四大组件之一,主要作用是实现各个应用程序之间的数据共享。它提供了一种机制,允许不同的应用程序共享数据,实现跨应用程序之间的数据交互。...

    Content Provider的使用

    这篇博客“Content Provider的使用”深入探讨了如何在Android开发中利用Content Provider实现数据共享和访问。 Content Provider的核心在于提供一个标准的接口,使得任何应用程序都能够通过URI(Uniform Resource ...

    Android中使用Content Provider组件访问通讯录中的联系人和添加联系人案例详解

    本文将深入探讨如何使用Content Provider组件来访问和操作Android设备上的通讯录,特别是针对联系人信息的读取和添加。我们将以具体的案例分析,帮助开发者更好地理解和实践这一功能。 首先,理解Content Provider...

    android provider

    在这个"android provider"主题中,我们将深入探讨Content Provider的工作原理、实现方式以及如何在实际应用中使用。 1. **Content Provider的基本概念** - Content Provider是一种标准化的数据接口,允许不同应用...

    content_provider_demo

    在Android开发中,Content Provider是一种重要的组件,它允许应用程序之间共享数据。`content_provider_demo`是一个展示如何创建和使用Content Provider的示例项目。在这个项目中,开发者将学习如何为其他应用提供...

    content provider实现数据共享demo(内有两个项目)

    在Android应用开发中,Content Provider是一种重要的组件,它允许应用程序之间进行数据共享。Content Provider作为Android系统中的数据接口,能够使一个应用的数据被其他应用访问和操作,这在多应用协同工作或者数据...

    Content Provider获取联系人和图片

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作数据。...理解并熟练掌握Content Provider的使用,对于提升Android开发能力至关重要。

    android content provider两个程序共享数据实例demo

    android content provider两个程序共享数据实例demo。简单的两个应用app之间共享数据。 getContentResolver().insert() getContentResolver().query() getContentResolver().delete() getContentResolver().update()

    Android Content Provider详解及示例代码

    Android:Content Provider的使用。 1、Content Provider 简介 2、使用现成的Content Provider 3、定义自己的Content Provider 一、Content Provider 简介 我们说Android应用程序的四个核心组件是:Activity、...

    2011.09.07(4)——— android 跨进程通信之content provider

    通常,我们使用`&lt;authority&gt;`:`&lt;path&gt;`的形式来表示,其中`&lt;authority&gt;`是Content Provider的唯一标识,一般在AndroidManifest.xml中通过`&lt;provider&gt;`标签的`android:authorities`属性设置;`&lt;path&gt;`则代表数据的...

Global site tag (gtag.js) - Google Analytics