Android中contentProvider的用途

简介: 使用内容供应商共享数据 如果直接访问磁盘文件(SDCard|File|SQLite数据库|首选项),需要很多底层的交互细节,但该种方式,只使用url即可对应用程序进行访问,并统一了数据访问方式。 public class PersonContentProvider extends ContentProvider{ //在该生命周期中才能正确得到Content对象。 public

使用内容供应商共享数据

如果直接访问磁盘文件(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);

}

}

内容解析器如若要对数据变更,需要使用ContentObserveruri进行监听,收到通知后,回调处理方法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" />

目录
相关文章
|
4月前
|
数据库 Android开发 开发者
Android Studio入门之内容共享ContentProvider讲解以及实现共享数据实战(附源码 超详细必看)
Android Studio入门之内容共享ContentProvider讲解以及实现共享数据实战(附源码 超详细必看)
41 0
|
3月前
|
存储 XML 文件存储
Android数据存储:什么是SharedPreferences?它有什么用途?
Android数据存储:什么是SharedPreferences?它有什么用途?
75 0
|
4月前
|
数据库 Android开发 Kotlin
android开发,使用kotlin学习ContentProvider
android开发,使用kotlin学习ContentProvider
47 0
|
8月前
|
Java Android开发
Android 四大组件之ContentProvider 访问通讯录进行增删改查操作
Android 四大组件之ContentProvider 访问通讯录进行增删改查操作
51 0
|
8月前
|
API 数据库 Android开发
Android ContentProvider内容提供者详解
Android ContentProvider内容提供者详解
37 2
|
10月前
|
存储 API 数据库
Android:四大组件之 ContentProvider(外共享数据)
数据库在 Android 当中是私有的,不能将数据库设为 WORLD_READABLE,每个数据库都只能允许创建它的包访问。这意味着只有创建这个数据库的应用程序才可访问它。也就是说不能跨越进程和包的边界,直接访问别的应用程序的数据库。那么如何在应用程序间交换数据呢? 如果需要在进程间传递数据,可以使用 ContentProvider 来实现。
212 0
Android:四大组件之 ContentProvider(外共享数据)
|
存储 数据库 Android开发
android中数据存储的contentprovider的使用方法
android中数据存储的contentprovider的使用方法
103 0
|
SQL 存储 自然语言处理
Android | ContentProvider 筑基篇 | 牛气冲天新年征文
Android | ContentProvider 筑基篇 | 牛气冲天新年征文
92 0
Android | ContentProvider 筑基篇 | 牛气冲天新年征文
|
API Android开发 对象存储
Android | 使用 ContentProvider 无侵入获取 Context
Android | 使用 ContentProvider 无侵入获取 Context
348 0
Android | 使用 ContentProvider 无侵入获取 Context
|
存储 缓存 数据库
Android ContentProvider支持跨进程数据共享与&quot;互斥、同步&quot;杂谈
Android ContentProvider支持跨进程数据共享与&quot;互斥、同步&quot;杂谈
502 0
Android ContentProvider支持跨进程数据共享与&quot;互斥、同步&quot;杂谈