ContentProvider与ContentResolver使用

 

例如以下内容为从网络转载:
使用ContentProvider共享数据:
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就能够向其它应用共享其数据。虽然使用其它方法也能够对外共享数据,但数据訪问方式会因数据存储的方式而不同,如:採用文件方式对外共享数据,须要进行文件操作读写数据;採用sharedpreferences共享数据,须要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的优点是统一了数据訪问方式。
当应用须要通过ContentProvider对外共享数据时,第一步须要继承ContentProvider并重写以下方法:
public class PersonContentProvider extends ContentProvider{
   public boolean onCreate()
   public Uri insert(Uri uri, ContentValues values)
   public int delete(Uri uri, String selection, String[] selectionArgs)
   public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
   public String getType(Uri uri)}
第二步须要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其它应用找到该ContentProvider ContentProvider 採用了authorities(主机名/域名)对它进行唯一标识,你能够把 ContentProvider看作是一个站点(想想,站点也是提供数据者),authorities 就是他的域名:
<manifest .... >
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/>
    </application>
</manifest>
注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
l

 

 

Uri介绍:
Uri代表了要操作的数据,Uri主要包括了两部分信息:1》须要操作的ContentProvider 2》对ContentProvider的什么数据进行操作,一个Uri由下面几部分组成:
l
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者能够依据这个标识来找到它。
路径(path)能够用来表示我们要操作的数据,路径的构建应依据业务而定,例如以下:
要操作person表中id10的记录,能够构建这种路径:/person/10
要操作person表中id10的记录的name字段,person/10/name
要操作person表中的全部记录,能够构建这种路径:/person
要操作xxx表中的记录,能够构建这种路径:/xxx
当然要操作的数据不一定来自数据库,也能够是文件等他存储方式,例如以下:
要操作xml文件里person节点下的name节点,能够构建这种路径:/person/name
假设要把一个字符串转换成Uri,能够使用Uri类中的parse()方法,例如以下:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")

lUriMatcher类使用介绍:
由于Uri代表了要操作的数据,所以我们非常常常须要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher类用于匹配Uri,它的使用方法例如以下:
首先第一步把你须要匹配Uri路径所有给注冊上,例如以下:
//常量UriMatcher.NO_MATCH表示不匹配不论什么路径的返回码
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//假设match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI(cn.itcast.provider.personprovider, person, 1);//加入须要匹配uri,假设匹配就会返回匹配码
//假设match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {
   case 1
    break;
   case 2
    break;
   default://不匹配
break;
}
注冊完须要匹配的Uri后,就能够使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个參数,如果匹配content://cn.itcast.provider.personprovider/person路径,返回的匹配码为1
lContentUris类使用介绍:
ContentUris类用于获取Uri路径后面的ID部分,它有两个比較有用的方法:
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10);
//生成后的Uri为:content://cn.itcast.provider.personprovider/person/10
parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10
l使用ContentProvider共享数据:
ContentProvider类主要方法的作用:
public boolean onCreate()
该方法在ContentProvider创建后就会被调用, Android在系统启动时就会创建ContentProvider
public Uri insert(Uri uri, ContentValues values)
该方法用于供外部应用往ContentProvider加入数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于供外部应用从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于供外部应用更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于供外部应用从ContentProvider中获取数据。
public String getType(Uri uri)
该方法用于返回当前Url所代表数据的MIME类型。假设操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,比如:要得到全部person记录的Uricontent://cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。假设要操作的数据属于单一数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,比如:得到id10person记录,Uricontent://cn.itcast.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person
l使用ContentResolver操作ContentProvider中的数据:
当外部应用须要对ContentProvider中的数据进行加入、删除、改动和查询操作时,能够使用ContentResolver 类来完毕,要获取ContentResolver 对象,能够使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类同样签名的四个方法:
public Uri insert(Uri uri, ContentValues values)
该方法用于往ContentProvider加入数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于从ContentProvider中获取数据。
这些方法的第一个參数为Uri,代表要操作的是哪个ContentProvider和对当中的什么数据进行操作,如果给定的是: Uri.parse(“content://cn.itcast.provider.personprovider/person/10”),那么将会对主机名为cn.itcast.provider.personproviderContentProvider进行操作,操作的数据为person表中id10的记录

l使用ContentResolver操作ContentProvider中的数据:
使用ContentResolverContentProvider中的数据进行加入、删除、改动和查询操作:
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);
//获取person表中全部记录
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}
//id1的记录的name字段值更改新为liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "liming");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//删除id2的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
public class PersonContentProvider extends ContentProvider{ private DataBaseOpenHelper dataBaseOpenHelper; private static final int ALLPERSON=1; private static final int PERSON=2; private static final UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); static{ uriMatcher.addURI("com.gao.provider.personprovider", "person", ALLPERSON); uriMatcher.addURI("com.gao.provider.personprovider", "person/#", PERSON); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase(); int count=0; switch (uriMatcher.match(uri)) { case ALLPERSON://content://com.gao.provider.personprovider/person count=database.delete("person", selection, selectionArgs); break; case PERSON://content://com.gao.provider.personprovider/person/100 long id=ContentUris.parseId(uri); String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?"; String[] params=new String[]{String.valueOf(id)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i = 0; i < selectionArgs.length; i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length+1]=String.valueOf(id); } count=database.delete("person", where, selectionArgs); break; default: throw new IllegalArgumentException("Unkonw uri:"+uri); } return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case ALLPERSON: return "vnd.android.cursor.dir/personprovider.person"; case PERSON: return "vnd.android.cursor.item/personprovider.person"; default: break; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase(); long id=0; switch (uriMatcher.match(uri)) { case ALLPERSON://content://com.gao.provider.personprovider/person id=database.insert("person", "name", values);//返回记录的行号,主键是int,实际上就是主键值 return ContentUris.withAppendedId(uri, id); case PERSON://content://com.gao.provider.personprovider/person/100 id=database.insert("person", "name", values); String path=uri.toString(); return Uri.parse(path.substring(0, path.lastIndexOf("/"))+"id"); default: throw new IllegalArgumentException("Unkonw uri:"+uri); } } @Override public boolean onCreate() { dataBaseOpenHelper=new DataBaseOpenHelper(this.getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase database=dataBaseOpenHelper.getReadableDatabase(); switch (uriMatcher.match(uri)) { case ALLPERSON: database.query("person", projection, selection, selectionArgs, null, null, sortOrder); break; case PERSON: long id=ContentUris.parseId(uri); String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?"; String[] params=new String[]{String.valueOf(id)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i = 0; i < selectionArgs.length; i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length+1]=String.valueOf(id); } database.query("person", projection, where, params, null, null, sortOrder); break; default: break; } return null; } //update("content://com.gao.provider.personprovider/person/100",values,"name like ? and ...",new String[]{"%gao%"}); @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase(); int count=0; switch (uriMatcher.match(uri)) { case ALLPERSON://content://com.gao.provider.personprovider/person count=database.update("person", values, selection,selectionArgs); break; case PERSON://content://com.gao.provider.personprovider/person/100 long id=ContentUris.parseId(uri); String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?"; String[] params=new String[]{String.valueOf(id)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i = 0; i < selectionArgs.length; i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length+1]=String.valueOf(id); } count=database.update("person", values, where,params); break; default: throw new IllegalArgumentException("Unkonw uri:"+uri); } return count; } }  
AndroidManifest.xml:
<provider android:name="PersonContentProvider"
android:authorities="com.gao.provider.personprovider" />
在还有一个程序ContentProviderUser中使用上面的内容提供者:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Uri allUri=Uri.parse("content://com.gao.provider.personprovider/person"); ContentValues values=new ContentValues(); values.put("name", "GGGGG"); values.put("age", 19); contentResolver.insert(uri, values); values.put("name", "CCCCCC"); values.put("age", 100); Uri uri=Uri.parse("content://com.gao.provider.personprovider/person/9"); // contentResolver.update(uri, values, null, null); //contentResolver.delete(uri, null, null); Cursor cursor=contentResolver.query(uri, new String[]{"personid","name","age"}, null, null, "personid desc"); while (cursor.moveToNext()) { Log.i(TAG, "psrsonid:"+cursor.getInt(0)+",name:"+cursor.getString(1)+",age"+cursor.getInt(2)); } cursor.close(); } 

 

转载于:https://www.cnblogs.com/blfshiye/p/4076025.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cshtml中引用css_ASP.NET CoreMVC 中的控制器

Controller in ASP.NET Core MVC在本节中&#xff0c;我们将讨论 Controller 是什么以及它在 ASP.NET Core MVC 中的作用。Fiddler需要大家提前装一个工具&#xff0c;https://www.telerik.com/fiddlerFiddler 是一个 http 协议调试代理工具&#xff0c;它能够记录并检查所有你…

小学阅读方法六种_小学生掌握了这些语文答题方法,轻松应对阅读理解,不再是难事...

家长们都知道&#xff0c;孩子们在学习数学的时候&#xff0c;重要的就是数学的一些公式&#xff0c;只要把数学公式记牢&#xff0c;做很多题的时候灵活运用&#xff0c;就可以解答。今天我们来看看&#xff0c;语文方面也有一些答题公式&#xff0c;当孩子们完全掌握了这些公…

hdu--4028--dp

这个dp我没做出来啊...其实不难..主要题意没理解好 fuck. 给你1-N这N个数 一共2^N-1个子集 每个子集的LCM值>M的情况数有多少种 我也是醉了 这么个题目 给我套他那个题面 硬是没看懂 他在问什么 还是 英语太渣了 然后就是个 状态转移方程的考虑了 map<LL,LL>dp[size]…

敏捷中gwt含义_在您的GWT应用程序中添加JSON功能

敏捷中gwt含义JSON简介 在Web应用程序上工作时&#xff0c;总是会出现客户端-服务器数据交换的问题。 在此问题上有多种方法&#xff0c;其中许多使用XML进行交换。 执行此任务的一种不太知名的格式是JSON。 JSON&#xff08;JavaScript对象表示法&#xff09;是一种轻量级的数…

c++ 经典代码_C语言经典100题(31)

1上期答案揭晓首先给大家看看上一篇文章C语言经典100题(30)中第三部分编程题的答案&#xff1a;#include int main( ){ long ge,shi,qian,wan,x; printf("请输入 5 位数字&#xff1a;"); scanf("%ld",&x); wanx/10000; /*分解出万…

android读取excel文件_python里读写excel等数据文件的几种常用方式

python处理数据文件第一步是要读取数据&#xff0c;文件类型主要包括文本文件(csv、txt等)、excel文件、数据库文件、api等。下面整理下python有哪些方式可以读取数据文件。1. python内置方法(read、readline、readlines)read() &#xff1a; 一次性读取整个文件内容。推荐使用…

UGUI学习笔记之渲染顺序

转载请注明地址&#xff1a;http://www.cnblogs.com/Vincentblogs/p/4083028.html QQ群&#xff1a;346738352 Unity技术交流群&#xff0c;讲纯粹的技术。 数据记录为Unity4.6b21版本 图片解释&#xff1a;这是一个按钮UI,层级1显示的是按钮背景&#xff0c;层级2显示的Image…

C#找出数组中重复次数最多的数值

给定一个int数组&#xff0c;里面存在重复的数值&#xff0c;如何找到重复次数最多的数值呢? 这是在某社区上有人提出的问题&#xff0c;我想到的解决方法是分组。 1、先对数组中的所有元素进行分组&#xff0c;那么&#xff0c;重复的数值肯定会被放到一组中&#xff1b; 2、…

spark-sql建表语句限制_第三篇|Spark SQL编程指南

在《第二篇|Spark Core编程指南》一文中&#xff0c;对Spark的核心模块进行了讲解。本文将讨论Spark的另外一个重要模块--Spark SQL&#xff0c;Spark SQL是在Shark的基础之上构建的&#xff0c;于2014年5月发布。从名称上可以看出&#xff0c;该模块是Spark提供的关系型操作AP…

4固定在底部_礼堂椅厂家教你如何固定座椅

礼堂椅厂家众所周知&#xff0c;当人们离开时&#xff0c;礼堂或刷房中使用的座椅会自动翻转到垂直位置&#xff0c;因此行和行之间有一条大通道让人走路。 在现有技术中&#xff0c;通过以下方法翻转礼堂椅&#xff1a;在两个支腿之间设置固定轴&#xff0c;并且在支座底部的两…

python时间去掉t_Python的set集合详解

Python 还包含了一个数据类型 —— set &#xff08;集合&#xff09;。 集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。 集合对象还支持 union&#xff08;联合&#xff09;&#xff0c;intersection&#xff08;交&#xff09;&#xff0c;difference&…

快乐学习 Ionic Framework+PhoneGap 手册1-3 {面板切换}

编程的快乐和乐趣&#xff0c;来自于能成功运行程序并运用到项目中,会在后面案例&#xff0c;实际运用到项目当中与数据更新一起说明 从面板切换开始&#xff0c;请看效果图和代码&#xff0c;这只是一个面板切换的效果 Index HTML Code <!DOCTYPE html> <html ng-ap…

去掉左边0_SLAM从0到1——11. 视觉里程计VO内容框架

「本文是之前学习VO 部分整理的思维导图&#xff0c;笔记写入之后均折叠了起来&#xff0c;正文中采用markdown格式展开&#xff0c;可看到笔记内容」放上来的目的其实是方便自己查阅笔记&#xff0c;同样给有需要的同学提供一点思路。整体上的结构分为5部分&#xff0c;包括常…

教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰&#xff0c;那么我想您也希望跳过填写表单和输入新密码的操作 。 只要有权限&#xff0c;许多人都希望使用第三方登录&#xff0c;只要他们要求的权…

柔性太阳能电池pdf_房车旅行如何做到电力无忧,那就选择一套合适的太阳能供电系统吧...

“旅行途中房车电力够不够用&#xff1f;”是众多车友在购买房车时会考虑的因素之一。而房车外部供电方式一般有三种&#xff1a;电网供电、发电机发电和太阳能发电&#xff0c;其中太阳能发电因其结构简单、体积小且轻、易安装、维护简单、寿命长不易损坏、一次性投资、循环利…

POJ 3617

题意&#xff1a;给定长度为N的字符串S&#xff0c;现要构造一个字符串T&#xff08;起初为空串&#xff09;。任意进行一下的一种操作&#xff1a; 1>从S的头部删除一个字符&#xff0c;加到T的尾部 2>从S的尾部删除一个字符&#xff0c;加到T的尾部 目的使T的字典序最小…

echarts的词云图表类型有哪些_数据可视化之常见12种图表类型分析

数据可视化有众多展现方式&#xff0c;不同的数据类型要选择适合的展现方法&#xff0c;今天友创云天就整理分析了几种常见的类型&#xff0c;给大家提供参考。1.饼图饼图是一个划分为几个扇形的圆形统计图表。每个扇形的弧长&#xff08;以及圆心角和面积&#xff09;大小&…

使用Spring Boot和注释支持配置Spring JMS应用程序

1.简介 在以前的文章中&#xff0c;我们学习了如何使用Spring JMS配置项目。 如果查看有关使用Spring JMS进行消息传递的文章介绍 &#xff0c;您会注意到它是使用XML配置的。 本文将利用Spring 4.1版本中引入的改进 &#xff0c;并仅使用Java config来配置JMS项目。 在这个示…

室内主题元素分析图_2020届室内设计专业优秀毕业设计作品展(五)

“环”食疗养生空间概念设计△建筑外立面▲LOGO前 言每当人们提及健康时&#xff0c;人们的反应往往是运动、睡眠和饮食。现代的青年上班族&#xff0c;又因为快节奏的生活&#xff0c;工作压力大&#xff0c;饮食的不规律&#xff0c;生活不良习性的增加&#xff0c;导致了各…

C++输入cin详解

C输入cin详解 输入原理&#xff1a; 程序的输入都建有一个缓冲区&#xff0c;即输入缓冲区。一次输入过程是这样的&#xff0c;当一次键盘输入结束时会将输入的数据存入输入缓冲区&#xff0c;而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的&#xf…