(一)程序之间共享数据的方式
SharedPreferences,文件,SQLite数据库,ContentProvider
(二)ContentProvider简介
ContentProvider是不同应用程序之间进行数据交换的标准API.ContentProvider是以某种Uri的形式对外提供数据。允许其他应用访问或者修改数据,其他应用程序使用ContentResolver根据Uri去访问数据。
(三)开发ContentProvider的步骤
1.定义自己的ContentProvider类,该类继承ContentProvider基类
2.在AndroidManifest.xml文件注册这个ContentProvider,注册时需要为其绑定一个Uri
在<application>中添加如下
<!--下面配置中name数据指定ContentProvider类
authorities就相当于为该ContentProvider指定域名-->
<provider android:name=".DrectProvider"
android:authorities="org.crayit.providers.dictprovider"
android:exported="true" />
CRUD操作
public boolean onCreate() 其它应用程序第一次访问ContentProvider时,回调该方法
public Uri insert(Uri uri, ContentValues values)根据Uri插入values对应的数据
public int delete(Uri uri,String selection,String[] selectionArgs)根据Uri删除Selection条件所匹配的全部记录项
public int update(Uri uri,ContentValues value, String selection, String[] selectionArgs)根据Uri更新Selection条件所匹配的全部记录项
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
根据Uri查询Selection条件所匹配的全部记录项,其中projection是指定的数据列
public String getType(Uri uri) 返回当前Uri所代表的数据的MIME类型,如果该Uri对应数据包含多个选项,则返回值是vnd.android.cursor.dir/开头,如果是单条数据则是vnd.android.cursor.item开头
(四)ContentProvider的Uri简介
列如:
content://org.crazyit.providers.dictprovider/words
content://是android系统所规定的协议
org.crazyit.provider.dictprovider是ContentProvider的authorities
words则是资源部分
content://org.crazyit.providers.dictprovider/word/2
访问word数据中ID为2的记录
content://org.crazyit.providers.dictprovider/word/2/word
访问word数据中ID为2的记录的word字段
大部分使用ContentProvider所操作的数据都来自于数据库,但有时也可以来自文件,XML或网络等其他存储方式
如下面的uri表示访问word节点下的detail节点
content://org.crazyit.providers.dictprovider/word/detail
为了将字符串装换成Uri,Uri工具提供了parse()静态方法
(五)使用ContentResolver操作数据
ContentResolver相当于HttpClient
通过getContentResolver()获取对应应用的ContentResolver对象
insert(Uri uri,ContentValues values)向Uri对应的CotentProvider中插入values对应的数据
delete(Uri uri,String where,String[] selectionArgs) 删除Uri对应的ContentProvider中Where提交匹配的数据
update(Uri uri,ContentValues values,String where,String[] selectionArgs)更新Uri对应的ContentProvider中where提交匹配的数据
query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
(六)ContentProvider与ContentResolver,Uri三者之间关系
ContentResolver向Uri执行CRUD操作
Uri则委托给该Uri对应的ContentProvider
ContentProvider则对数据进行相应的操作
(七)开发一个CotentProvider子类步骤
1.开发一个ContentProvider子类,该子类只需要实现query(),insert(),update()和delete()等方法
2.在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性
为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数据。Android系统提供了UriMatcher类
UriMatcher主要提供如下两个方法
Void addURI(String authority,String path,int code) 向UriMathcer注册Uri,其中anthority和path组合成一个Uri
int match(Uri uri)根据掐面注册的Uri来判断Uri的标识码,如果未找到则返回-1
除此之外,Android还提供了ContentUris工具类
withAppendedld(uri ,id) 用于为路径加上ID部分
ParseId(Uri)从Uri路径中解析出ID
(八)ContentObserver监听ContentProvider的数据变化
只要ContentProvider的数据发生变化,即需要使用getContext().getContentResolver().nofifyChange(uri,null)通知所有注册在改Uri的监听器
监听ContentProvider的数据变化,继承ContentObserver基类,重写onChange(boolean selfChange)
通过ContentResolver向指定Uri注册ContentObserver监听器
registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer)
uri:该监听器所监听的ContentProvider的Uri
notifyForDescendents 设置子目录是否允许通知
observer:监听器实例
getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new SmsObserver(new Handler()));
SharedPreferences,文件,SQLite数据库,ContentProvider
(二)ContentProvider简介
ContentProvider是不同应用程序之间进行数据交换的标准API.ContentProvider是以某种Uri的形式对外提供数据。允许其他应用访问或者修改数据,其他应用程序使用ContentResolver根据Uri去访问数据。
(三)开发ContentProvider的步骤
1.定义自己的ContentProvider类,该类继承ContentProvider基类
2.在AndroidManifest.xml文件注册这个ContentProvider,注册时需要为其绑定一个Uri
在<application>中添加如下
<!--下面配置中name数据指定ContentProvider类
authorities就相当于为该ContentProvider指定域名-->
<provider android:name=".DrectProvider"
android:authorities="org.crayit.providers.dictprovider"
android:exported="true" />
CRUD操作
public boolean onCreate() 其它应用程序第一次访问ContentProvider时,回调该方法
public Uri insert(Uri uri, ContentValues values)根据Uri插入values对应的数据
public int delete(Uri uri,String selection,String[] selectionArgs)根据Uri删除Selection条件所匹配的全部记录项
public int update(Uri uri,ContentValues value, String selection, String[] selectionArgs)根据Uri更新Selection条件所匹配的全部记录项
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
根据Uri查询Selection条件所匹配的全部记录项,其中projection是指定的数据列
public String getType(Uri uri) 返回当前Uri所代表的数据的MIME类型,如果该Uri对应数据包含多个选项,则返回值是vnd.android.cursor.dir/开头,如果是单条数据则是vnd.android.cursor.item开头
(四)ContentProvider的Uri简介
列如:
content://org.crazyit.providers.dictprovider/words
content://是android系统所规定的协议
org.crazyit.provider.dictprovider是ContentProvider的authorities
words则是资源部分
content://org.crazyit.providers.dictprovider/word/2
访问word数据中ID为2的记录
content://org.crazyit.providers.dictprovider/word/2/word
访问word数据中ID为2的记录的word字段
大部分使用ContentProvider所操作的数据都来自于数据库,但有时也可以来自文件,XML或网络等其他存储方式
如下面的uri表示访问word节点下的detail节点
content://org.crazyit.providers.dictprovider/word/detail
为了将字符串装换成Uri,Uri工具提供了parse()静态方法
(五)使用ContentResolver操作数据
ContentResolver相当于HttpClient
通过getContentResolver()获取对应应用的ContentResolver对象
insert(Uri uri,ContentValues values)向Uri对应的CotentProvider中插入values对应的数据
delete(Uri uri,String where,String[] selectionArgs) 删除Uri对应的ContentProvider中Where提交匹配的数据
update(Uri uri,ContentValues values,String where,String[] selectionArgs)更新Uri对应的ContentProvider中where提交匹配的数据
query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
(六)ContentProvider与ContentResolver,Uri三者之间关系
ContentResolver向Uri执行CRUD操作
Uri则委托给该Uri对应的ContentProvider
ContentProvider则对数据进行相应的操作
(七)开发一个CotentProvider子类步骤
1.开发一个ContentProvider子类,该子类只需要实现query(),insert(),update()和delete()等方法
2.在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性
为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数据。Android系统提供了UriMatcher类
UriMatcher主要提供如下两个方法
Void addURI(String authority,String path,int code) 向UriMathcer注册Uri,其中anthority和path组合成一个Uri
int match(Uri uri)根据掐面注册的Uri来判断Uri的标识码,如果未找到则返回-1
除此之外,Android还提供了ContentUris工具类
withAppendedld(uri ,id) 用于为路径加上ID部分
ParseId(Uri)从Uri路径中解析出ID
(八)ContentObserver监听ContentProvider的数据变化
只要ContentProvider的数据发生变化,即需要使用getContext().getContentResolver().nofifyChange(uri,null)通知所有注册在改Uri的监听器
监听ContentProvider的数据变化,继承ContentObserver基类,重写onChange(boolean selfChange)
通过ContentResolver向指定Uri注册ContentObserver监听器
registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer)
uri:该监听器所监听的ContentProvider的Uri
notifyForDescendents 设置子目录是否允许通知
observer:监听器实例
getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new SmsObserver(new Handler()));