Android中contentProvider的用途

使用内容供应商共享数据

如果直接访问磁盘文件(SDCard|File|SQLite数据库|首选项),需要很多底层的交互细节,但该种方式,只使用url即可对应用程序进行访问,并统一了数据访问方式。

public class PersonContentProvider extends ContentProvider{

//在该生命周期中才能正确得到Content对象。

public boolean onCreate(){

//...

}

public Uri insert(Uri uri,ContentValues values); 

....

<application android:icon="@drawable/icon"

Android:label="@string/app_name">

<!--注册供应商-->

<provider android:name=".PersonContentProvider"

Android:authorities="cn.itcast.providers.personprovider"/>

</application>

URI:

Content://cn.itcast.provider.personprovider/person/10

Scheme         主机名或authority      路径  

Scheme:android规定,必须是content://

Authority:唯一标识该供应商。

path:代表操纵的数据。

将字符串转换成Uri对象

Uri uri = Uri.parse("content://xxxx/person/10");

UriMatcher:

使用该类,可以判断Uri如何哪一种模式

//若不匹配,返回UriMather.NO_MATCH

UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//一次添加匹配的模式串,以及匹配后返回的数值

//${authority}   ${path}

sMatcher.addURI("cn.itcast.contentprovider","person",1);

sMatcher.addURI("cn.itcast.contentprovider","person/#",2);

switch(sMatcher.match(Uri)){

case 1:

case 2:

.....

}

//获取uri后边ID部分的话,可以通过

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");

Uri resultUri = ContentUris.withAppendedId(uri,10); //...person/10

Uri.parse("content://cn.itcast.provider.personprovider/person/10")

Long personid = ContentUris.parseId(uri);

XxxContentProvider extends ContentProvider{

....

//该方法用于返回当前Url所代表数据的MIME类型,如果操作的数据属于集合类型,

//那么MIME类型字符串应该以vnd.android.cursor.dir/开头

//如:''vnd.android.cursor.dir/person"

//如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以

//vnd.android.cursor.item/开头

//如:vnd.android.cursor.item/person

public String getType(Uri uri){..}; 

}

使用内容解析器(ContentResolver):

ContentResolver resolver = getContentResolver();

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");

ContentValues values = new ContentValues();

values.put("name", "itcast");

values.put("age", 25);

//插入

resolver.insert(uri, values);

//查询

resolver.query(uri, null, null, null, "personid desc");

//更新

resolver.update(updateIdUri, updateValues, null, null);

//删除

resolver.delete(deleteIdUri, null, null);

监听contentprovider的数据变化

//供应商中的crud方法完成后需要发出数据变更的通知,以通知那些感兴趣的监听者

XxxContentProvider extends ContentProvider{

public long insert(){

...

getContext().getContentResolver().notifyChange(uri,null);

}

}

内容解析器如若要对数据变更,需要使用ContentObserver对uri进行监听,收到通知后,回调处理方法onChange();

context.getContentResolver().registerContentObserver(uri,true,new MyContentObserver(new Handler()));

class MyContentObServer extends ContentObserer{

public MyContentObServer(Handler handler){

super(handler);

}

public void onChange(){...}

}

监听用户发送(接收)的短信

系统自带的短信程序发送(或接收)短信时,会通过ContentProvider把短信保存进数据库,并且

发出一个变更通知(notifyChange).使用ContentObserver对数据变化进行监听,在用户发送

短信时,就会被ContentObserver窃听到短信.

//系统

Context.getContentResolver().notifyChange("content://sms",null);

//客户端:

Context.getContentResolver().registerObserver(uri,false,new 

ContentObserver(new Handler()){});

// content://sms/outbox

// content://sms/outbox

// content://sms/outbox

Cursor cursor = 

getContentResolver().query(Uri.parse("content://sms/outbox"),null, 

cursor.getInt(cursor.getColumnIndex("_id")));

cursor.getString(cursor.getColumnIndex("address")));

cursor.getString(cursor.getColumnIndex("body")));

cursor.getLong(cursor.getColumnIndex("date")));

注:

  <uses-permission android:name="android.permission.READ_SMS" />

时间: 2025-01-31 14:49:00

Android中contentProvider的用途的相关文章

Android中MimeType的用途

Android中MimeType的用途                 Intent-Filter中的<data>有一个mimeType . 它的作用是告诉Android系统本Activity可以处理的文件的类型.如设置为 "text/plain"表示可以处理".txt"文件. MimeTypeMap类                 MimeTypeMap类是专门处理mimeType的类. 类说明以及方法如下: Class Overview Two-w

Android 中ContentProvider的实例详解

Android 中ContentProvider的实例详解 Content Provider 的简单介绍: * Android中的Content Provider 机制可支持在多个应用中存储和读取数据.这也是跨应用 共享数据的唯一方式.在Android系统中,没有一个公共的内存区域,供多个应用共享存储数据: * Android 提供了一些主要数据类型的ContentProvider ,比如:音频.视频.图片和私人通讯录等: 在android.provider 包下面找到一些android提供的C

Android中ContentProvider和ContentResolver详解

Android中ContentProvider和ContentResolver详解 在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法: 1)AIDL 2)Broadcast 3)ContentProvider. 使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦:使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的:使用ContentProvider我们不需要接口描述,只

【Android】Android中ContentProvider组件详解

原文来自:http://blog.csdn.net/zuolongsnail/article/details/6566317 ContentProvider(内容提供者)是Android中的四大组件之一.主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据.   以下这段是Google Doc中

Android中ContentProvider组件详解

一.Android四大组件 Android四大组件是Activity, Service, Content Provider,Broadcast Receiver. Activity作为程序界面,直接与用户交互 Service运行在后台,没有界面,完成特定的功能 ContentProvider维护应用数据,方便应用本身或其它应用访问 Broadcast Receiver提供异步广播消息接收机制,便于各应用/组件进行交互 二.什么是ContentProvider         ContentPro

Android中ContentProvider 数据共享实现方法

那么我们也可以定义自己的ContentProvider来使跨应用共享数据.数据具体的存贮方式可以为数据库.文件,持久化或非持久化存储的其他形式.在这里我们还是使用sqlite数据库存贮数据吧. 老规矩,先来点基础知识. 一.基础知识 1:URI是什么?统一资源标识符,用来标识某一资源的. 通常一个Uri主要由以三部分组成:scheme.Authority.path 1.scheme:ContentProvider(内容提供者)的scheme已经由Android系统规定为:content:// 2

实例讲解Android中ContentProvider组件的使用方法_Android

ContentProvider基本使用为了在应用程序之间交换数据,android提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供ContentPRovider来实现,其他应用程序就可以通过ContentResolver来操作ContentProvider暴露的数据. 实现ContentProvider的步骤: 1)编写一个类,继承ContentProvide

详解Android中的ContentProvider和Uri

一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共 享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过 ContentProvider对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过 指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样也可以对外共享 数

Android中自定义ContentProvider实例

//以下为TestBaidu MainActivity如下: 复制代码 代码如下: package cn.testbaidu; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import an