android 系统之ContentProvider

基于上一篇的数据库操作,又写了一个ContentProvider的示例。把SQLiter 的数据提供出去供别的项目进行访问。

这一篇的代码要求熟悉SQLiter 的API.

首先,我们编写一个类extents ContentProvider ,重写他的方法。

 URI 在http 中我们称为统一资源定位符,就是可以通过uri定位到网络上某一资源。比方如:http://blog.csdn.net/liuc0317/article/details/6771233, 

http:// 是网终协议,是一个标准和规定。

  • public boolean onCreate() {}是在项目首次使用ContentProvider 的时候调用,只会调用一次,适合初始化一些数据。
  • public Uri insert(Uri uri, ContentValues values) {} 是否可供外部插入数据,如果需要插入数据就重写。
  • public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {}是否可供外部更新数据,如果需要更新数据就重写。
  • public int delete(Uri uri, String selection, String[] selectionArgs) {}是否可供外部删除数据,如果需要删除数据就重写。
  • public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {}是否可供外部查询数据,如果需要查询数据就重写。
  • public String getType(Uri uri) {}  可以获取到操作的类弄,如果是集合类型就会返回。vnd.android.cursor.dir/ 。如果是单条数据就返回vnd.android.cursor.item/
重写这么方法后需要填写一个可以精确定位到此ContentProvider 的声明:

 <application android:icon="@drawable/icon" android:label="@string/app_name">......<provider android:name=".PersonContentProvoider" android:authorities="com.hkrt.providers.personprovider"/> </application>
具体实现如下:
PersonContentProvider.javapackage com.hkrt.db;import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;import com.hkrt.server.PersonHelper;
/*** 内容的提供者不一定是数据库 可以是xml 或是网上资源* 在这里我们需要学习ContentProvider 和ContentUris工具类的使用方法* @author Administrator**/
public class PersonContentProvoider extends ContentProvider {private PersonHelper helper;private static final String TABLENAME="person";private static final String ID="id";private static final UriMatcher MATCHER=new UriMatcher(UriMatcher.NO_MATCH);private static final int PERSONS=1;private static final int PERSON=2;static{MATCHER.addURI("com.hkrt.providers.personprovider", "person", PERSONS);// 配置模式1 person 表中所有的记录数据MATCHER.addURI("com.hkrt.providers.personprovider", "person/#", PERSON); //配置模式2 person 表中id为指定的数据,# 是指标识}// 允许删除数据@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db  =	helper.getWritableDatabase();int num=0;switch (MATCHER.match(uri)) {case PERSONS:num=db.delete(TABLENAME, selection, selectionArgs);break;case PERSON:long personId = ContentUris.parseId(uri);String where=ID+"="+personId;num=db.delete(TABLENAME, where, selectionArgs);break;default:throw new IllegalArgumentException("Unkown url:"+uri);}return num;}@Overridepublic String getType(Uri uri) {switch (MATCHER.match(uri)) {case PERSONS:return "vnd.android.cursor.dir/";case PERSON:return "vnd.android.cursor.item/";default:break;}return null;}//允许插入数据@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db =helper.getWritableDatabase();switch (MATCHER.match(uri)) {case 1:long rowid = db.insert(TABLENAME, null, values);return	ContentUris.withAppendedId(uri, rowid);default:throw new IllegalArgumentException("Unkown URI:"+uri);}}//ContentProvider 第一次被调用时获取数据库的使用权@Overridepublic boolean onCreate() {helper = new PersonHelper(this.getContext());return true;}//允许查询数据	@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase db = 	helper.getReadableDatabase();Cursor cursor;switch (MATCHER.match(uri)) {case PERSONS:cursor = db.query(TABLENAME, projection, selection, selectionArgs, null, null, sortOrder);break;case PERSON:long personId= ContentUris.parseId(uri);String where =ID+"="+personId;if(selection!=null && !"".equals(selection.trim())){where+=selection;}cursor = db.query(TABLENAME, null, where, selectionArgs, null, null, sortOrder);break;default:throw new IllegalArgumentException("Unkown uri:"+uri);}return cursor;}//允许更新数据	//person//person/12	@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db =helper.getWritableDatabase();int num=0;switch (MATCHER.match(uri)) {case PERSONS:num =db.update(TABLENAME, values, selection, selectionArgs);break;case PERSON:long personid= ContentUris.parseId(uri);String where=ID +"=" + personid;if(selection!=null && !"".equals(selection.trim())){where+=" and "+selection;}num =db.update(TABLENAME, values, where, selectionArgs);break;default:throw new IllegalArgumentException("Unkown URI:"+uri);}return num;}}

以上的代码就可以把person 数据表中所有操作,提供出来供别的程序访问了。
工具类ContentUris 的使用:
Uri uri=Uri.parse("content://com.hkrt.providers.personprovider/person");
String rowid="2"
Uri uri2=Uri.parse("content://com.hkrt.providers.personprovider/person/2");
  • ContentUris.withAppendedId(uri, rowid); // 现在的结果就是com.hkrt.providers.personprovider/person/2
  • ContentUris.parseId(uri2);// 那么也在的就结果就是2
再下来我们测试我写的代码是否正确,我们需要使用androidTestCase 进行测试,测试环境还需要搭建。
我在其他的项目中新建了一个类进行对ContentProvider 的代码进行测试。实现代码如下:
package com.hkrt;import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;public class ContentProviderTest extends AndroidTestCase {String TAG="ContentProviderTest";// 测试访问ContentProvider 插入数据    	public void testAccessContentProvider() throws Throwable{Uri uri = Uri.parse("content://com.hkrt.providers.personprovider/person");ContentResolver resolver = 	this.getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "宋江");Uri url = resolver.insert(uri, values);Log.i(TAG, url.toString());}//测试访问ContentProvider 更新数据public void updateContentProvider() throws Throwable{Uri uri = Uri.parse("content://com.hkrt.providers.personprovider/person/2");ContentResolver resolver = this.getContext().getContentResolver();long personId = ContentUris.parseId(uri);String where ="id=?";ContentValues values = new ContentValues();values.put("name", "刘成");String [] result ={String.valueOf(personId)};int rowid = resolver.update(uri, values, where, result);Log.i(TAG, String.valueOf(rowid));}}

经过我的测试没有问题。我把结果导出后的插图如下:


注:id为6的新插入的数据,id为2的就新修改的数据。 其他的实现没有写。可以类比。

转载于:https://www.cnblogs.com/java20130726/archive/2011/09/14/3218356.html

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

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

相关文章

你是中层管理者?嗯,一个表面看似风光,实际却很 “鸡肋” 的重要岗位

这是头哥侃码的第246篇原创每年的六七月份&#xff0c;上海都会进入梅雨季节。这段时期的上海天气就好比大小姐的脾气&#xff0c;阴晴不定&#xff0c;完全看心情做事&#xff0c;心情好的时候&#xff0c;给你个阳光&#xff0c;让你的生活和休闲时光多一些灿烂&#xff0c;心…

重温SQL——行转列,列转行(转:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html)...

行转列&#xff0c;列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现&#xff0c;也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。 用传统的方法&#xff0c;比较好理解。层次清晰&#xff0c;而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法…

要男女朋友有什么用?

1 题&#xff1a;我不要面子的嘛&#xff01;2 狗都有人给撑伞了。。3 这大概就是传说中的一见钟情吧4 5 南方人说话有多软糯6 男女朋友有什么用你点的每个赞&#xff0c;我都认真当成了喜欢

低代码应用创新成果——轴承行业数字化智造系统(含MES/ERP/WMS)

轴承是当代机械设备中一种不可或缺的零部件&#xff0c;广泛应用于汽车、铁路车辆及各类工业机械和家用电器等国民经济的重要领域&#xff0c;是一种节约能源、提高效率的伟大发明。轴承行业作为装备制造业的先锋&#xff0c;一直以来都走在数字化转型的前列&#xff0c;引领行…

HelloSilverlight

一&#xff1a;输入姓名并选中一个日期&#xff0c;将在下面显示 二:XAML代码 <UserControl x:Class"HelloSilverlight.MainPage"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2…

21世纪7大数学难题,解决其中一个你就成为了百万富翁!

全世界只有3.14 % 的人关注了爆炸吧知识百万富翁你也可以昨天一大早&#xff0c;知识君就收到模友送的3枝红玫瑰。仔细一看&#xff0c;原来又是来跟知识君约稿的。。。知识君只能说&#xff1a;1900年&#xff0c;希尔伯特&#xff08;传送门&#xff09;在巴黎国际数学家代表…

在 Azure VM 上使用 Jitsi 搭建私人视频会议

点击上方蓝字 / 关注“汪宇杰博客”原文&#xff1a;Azure Tips And Tricks翻译&#xff1a;汪宇杰私人视频会议市面上有许多视频会议应用程序&#xff0c;例如 Zoom、Microsoft Teams 和 Skype。有时&#xff0c;您需要自己的服务&#xff0c;以让自己更安全并在自己的公司内部…

[LeetCode]119.Pascal#39;s Triangle II

题目 Given an index k, return the kth row of the Pascal’s triangle. For example, given k 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 思路 无 代码 /**------------------------------------* 日期&#xff1a…

终于有人做了我一直想做而不敢做的事。。

1 初中物理是不是学过&#xff0c;受力面积小&#xff0c;相应的压力就大&#xff5e;我觉得应该直接趴上去&#xff0c;一定行&#xff5e;反正我也是瞎说的2 不是我吹&#xff0c;换成是我&#xff0c;这包子能吃五屉3 交警蜀黍耐心的领着这位行人过马路&#xff0c;麻烦你快…

.NET 6 中的隐式命名空间引用

.NET 6 中的隐式命名空间引用Intro之前写过一篇隐式命名空间引用的大概介绍&#xff0c;在一些小的测试项目中也有在用&#xff0c;一直没作为示例给大家分享&#xff0c;主要原因在于之前看到了一个关于隐式命名空间引用的 Github issue 提到会有一些破坏性的变更&#xff0c;…

vscode函数跳转插件_人生苦短,我们为 Cocos Creator 开发的插件和工具

在使用 Cocos Creator 开发项目的过程中&#xff0c;为了提高开发效率我们开发了很多扩展插件&#xff0c;本文介绍常用的几款&#xff0c;抛砖引玉&#xff0c;希望给大家带来帮助。腾讯开心鼠英语网页扩展&#xff1a;运行时查看场景节点树Cocos Creator 本地项目通常会在 Ch…

SQLSERVER 日志收缩

SQL2008 的收缩日志 由于SQL2008对文件和日志管理进行了优化&#xff0c;所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消&#xff1a;(SQL2005)BackupLog DNName with no_loggodumptransaction DNName with no_loggoUSE DNName DBCC SHRINKFILE (2)Go---------------…

解决win7“该文件没有与之关联的程序来执行该操作”

机器装好了win7系统。右击“计算机”管理的时候&#xff0c;出现“该文件没有与之关联的程序来执行该操作”能是因为删除了start menu下的某个文件,经过分析,找到了如下的解决方法:定位到注册表HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\c…

绝不能放进微波炉的10样东西,最后一个太意外

全世界只有3.14 % 的人关注了爆炸吧知识前一阵&#xff0c;网上有一段用微波炉加热葡萄的视频&#xff0c;成了新闻热点。研究员在实验中发现&#xff0c;两颗葡萄放进微波炉后&#xff0c;竟然会产生电弧。图片来源网络之前小编加热汉堡的时候&#xff0c;本来想大快朵颐一顿&…

在 .NET 6 中使用 DATEONLY 和 TIMEONLY

在 .NET 6 中使用 DATEONLY 和 TIMEONLY在 即将发布的.NET 6中&#xff0c;引入了两种期待已久的类型作为核心库的一部分。DateOnly和TimeOnly允许开发人员表示 DateTime 的日期或时间部分。这两种新类型是结构体&#xff08;值类型&#xff09;&#xff0c;可以在您的代码独立…

vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

Vuejs 3.0 在北京时间2020年9月19日凌晨&#xff0c;终于发布了 3.0 版本&#xff0c;代号&#xff1a;One Piece。此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小&#xff0c;和更好的 TypeScript 支持。Vue3.0发布链接​github.comVue 是当前非常流行的框架…

Linux IPC实践(6) --System V消息队列(3)

消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid client进程发送的时候, mtype指定为自己进程的pid client进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收…

100斤的铁和100斤女生哪个重?

1 你是不是有别的猫了&#xff1f;-2 兔兔这么可爱我们沾点孜然再吃会更香3 解压的最好方式4 人不如猫系列5 这演技没sei了&#xff01;&#xff01;&#xff01;6 100斤的铁和100斤女生哪个重&#xff1f;7 如果只能选一个&#xff0c;你会选什么你点的每个赞&#xff…

JailbreakMe.com-最新浏览器模式破解iPhones,iPads和iPod Touches方法

一位***建立了该网站(JailbreakMe.com)&#xff0c;可以通过浏览器登录的形式破解几乎所有的iOS&#xff0c;这包括了iPhone,iPad,和iPod Touch&#xff0c;将解除Apple对这些设备的软件限制。 用户如果想尝试未经授权的app或者想在多个不同国家使用这些设备&#xff0c;都可以…

谷歌开源3D舞蹈生成模型FACT,舞姿清奇!

文 | 御坂弟弟出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;谷歌开源了其基于 AIST 的 3D 舞蹈生成模型 FACT。该模型不仅可以学习音乐-运动对应关系&#xff0c;还可以生成以音乐为基础的 3D 运动序列。此前&#xff0c;谷歌层发布了大规模的多模态 3…