Android学习笔记(十六) ContentProvider
1、相关概念
- ContentProvider:不同应用程序之间进行数据交换的标准API;程序“暴露”数据的方法。
- ContentResolver:一个程序访问另一个程序被“暴露”的数据的方法。
- Uri:Uri是ContentProvider和ContentResolver进行数据交换的标识。
举例说明:一个CotentResolver想要从一个ContentProvider那里获取数据,必须先要找到这个ContentProvider,找到的方法就是通过Uri这个参数,因为每一个Uri都有一个对应的ContentProvider。然后这个ContentResolver向Uri执行CRUD等操作,这个Uri再将这些CRUD操作委托给ContentProvider执行。
2、开发和配置ContentProvider
开发ContentProvider的具体过程较为复杂。因为开发时大多时候用Android自带的ContentProvider,所以这里仅作大概了解。
开发一个ContentProvider,需要先构造一个继承ContentProvider的子类,然后再在AndroidManifext.xml文件中注册。
2.1 继承ContentProvider
需要重写以下方法:
- public Cursor query(Uri uri, String[] projection, String where, String whereArgs, String sortOrder)
- public Uri insert(Uri uri, ContentValues values)
- public int update(Uri uri, ContentValues values String where, String whereArgs)
- public int delete(Uri uri, String where, String[] whereArgs)
- public boolean onCreate()
- public String getType()
2.2 配置ContentProvider
在<application…/>标签里加入:
< provider
android:name=".MyProvider"
android:authorities="com.providers.myprovider"
android:exported="true"/>
其中,name指定该ContentProvider的实现类的类名;
authorities指定该ContentProvider对应的Uri(相当于为该ContentProvider分配一个域名);
exported指定该ContentProvider是否允许被其他应用调用。
3、使用ContentResolver调用方法
Context提供了getContentResolver()方法,因此Activity、Service等组件都可以通过getContentResolver()方法获取ContentResolver对象。
public class MainActivity extends Activity{
ContentResolver contentResolver;
Uri uri = Uri.parse("content://com.providers.myprovider/"); @Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取系统的ContentResolver对象
ContentResolver = getContentResolver();
}
public void query(View source){
//调用ContentResolver的query()方法
//实际返回的是该Uri对应的ContentProvider的query()的返回值
Cursor cursor = contentResolver.query(uri,null,"query_where",null,null);
Toast.makeText(this,"远程ContentResolver返回的Cursor为:"+cursor,Toast.LENGTH_SHORT).show();
}
public void insert(View source){
ContentValues values = new ContentValues();
Values.put("name","fkjava");
//调用ContentResolver的insert()方法
//实际返回的是该Uri对应的ContentProvider的insert()的返回值
Uri newUri = contentResolver.insert(uri,values);
Toast.makeText(this,"远程ContentResolver新插入的记录的Uri为:"+newUri,Toast.LENGTH_SHORT).show();
}
public void update(View source){
ContentValues values = new ContentValues();
values.put("name","fkjava");
//调用ContentResolver的update()方法
//实际返回的是该Uri对应的ContentProvider的update()的返回值
int count = contentResolver.update(uri, values, "update_where", null);
Toast.makeText(this,"远程ContentResolver更新记录数为:"+count,Toast.LENGTH_SHORT).show();
}
public void delete(View source){
//调用ContentResolver的delete()方法
//实际返回的是该Uri对应的ContentProvider的delete()的返回值
int count = contentResolver.delete(uri, "delete_where", null);
Toast.makeText(this,"远程ContentResolver删除记录数为:"+count,Toast.LENGTH_SHORT).show();
}
}
4、UriMatcher
UriMatcher是方便对Uri进行操作的工具类,构造方法是:
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
该类包含两个方法:
- void addURI(String authority, String path, int code)
- int match(Uri uri)
其中authority和path组合成一个Uri,code是该Uri对应的标识码(用于区分多个Uri)。match()方法返回的是该Uri对应的标识码。
注:path中可以含有通配符“#”。假设某一个Uri的path为“word/#”,标识符为2,那么uriMatcher.match(Uri.parse(“content://com.providers.myprovider/word/10”))返回的值将会是2。
Android学习笔记(十六) ContentProvider的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference
目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供Mult ...
- Android学习笔记(六)——活动的启动模式
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动的启动模式共有四种: standard.singleTop.singleTask 和 singleInst ...
- 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST
目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...
- 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项
[-] 代码实现preference 利用preference保存状态 DialogPreference 代码实现preference View可以不通过xml进行设置,有代码直接进行设置,首选项pr ...
- 【转】 Pro Android学习笔记(六二):Preferences(6):header
目录(?)[-] 代码实现 header xml文件 在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型.在代码中,我们为了不提示warning ...
随机推荐
- POJ1426 Find The Multiple —— BFS
题目链接:http://poj.org/problem?id=1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Tota ...
- 一步一步学Silverlight 2系列(25):综合实例之Live Search
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- os、sys和shutil模块
运行环境:python3 OS模块:os 模块提供了一个统一的操作系统的接口函数 下面的path指路径的意思 os.stat(file) #查询文件属性操作 os.sep #取代操作系统特定的路径分隔 ...
- 【AMPPZ 2014】 The Captain
[题目链接] 点击打开链接 [算法] 按x轴排序,将相邻点连边 按y轴排序,将相邻点连边 然后对这个图跑最短路就可以了,笔者用的是dijkstra算法 [代码] #include<bits/st ...
- python整数与IP地址转换 [转]
我们有时会将一个整数与IP地址进行互换,用python代码实现很简单将一个整数如2000000,变为一个IP地址的方式 >>> import socket >>> ...
- 2019年5月22日 AY 程序员调侃语录
我是AY,杨洋,做wpf开发的,最近得了一种病,程序员患得患失综合征.同事说,我年纪在变大,技术跟不上.业余之间,我原创了写了一些语录,给大家中午休息,累疲惫的时候,开心放松下. 1.活着的每一天都无 ...
- Android Studio新建类头部注释和添加函数注释模板及快捷键
一,Android Studio新建类头部注释 是不是有时候看到这个很心烦 其实Studio中有设置修改这些注释模板的信息的功能 其实很简单,只需要两步: 1.打开Setting设置面板,找到File ...
- python __builtins__ bytes类 (8)
8.'bytes', 字符串转换成字节流.第一个传入参数是要转换的字符串,第二个参数按什么编码转换为字节. class bytes(object) | bytes(iterable_of_ints) ...
- P4141 消失之物(背包)
传送门 太珂怕了……为什么还有大佬用FFT和分治的…… 首先如果没有不取的限制的话就是一个裸的背包 然后我们考虑一下,正常的转移的话代码是下面这个样子的 ;i<=n;++i) for(int j ...
- 优化 SQL 查询:如何写出高性能SQL语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...