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;心…

20150203一些移动端H5小bug解决

都是一些我也不知道为什么会有的bug。 1. 在三星note2&#xff0c;小米2&#xff0c;页面加载后&#xff0c;页面有黑块. 那么提高被盖住的部分z-index。 2. iphone5 &#xff0c;ios7.0.4&#xff0c;上文字显示不出 那么就先hide&#xff0c;setTimeout几百毫秒再show

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

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

php正则获取标签,PHP通过正则匹配中文字符 过滤html标签 获取文本内容

正则匹配中文汉字根据页面编码不同而略有区别&#xff1a;GBK/GB2312编码&#xff1a;[x80-xff] 或 [xa1-xff]UTF-8编码&#xff1a;[x{4e00}-x{9fa5}]/u[php]$str "账单123";//GBK/GB2312使用&#xff1a;preg_match_all("/[\x80-\xff]/", $str, $chines…

python监控机票价格_喜欢旅行又怕吃土?让Python来爬取最便宜机票吧!

图源&#xff1a;videoblocks.com你喜欢旅行吗&#xff1f;这个问题通常会得到一个肯定的答案&#xff0c;随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗&#xff1f;”也许话题就到此为止了…

伤不起的指针

虽然知道怎么做&#xff0c;但是还是做一遍啦。结果调试了两个多小时&#xff0c;真崩溃。 /* * * * Filename: intlist.h * * Description: * * Version: 1.0 * Created: 09/16/2011 02:56:13 AM * Revision: none * Compiler: gc…

[禅悟人生]尊严非席, 不可卷起

日本江户时期是一个社会很不稳定的时期&#xff0c;浪人武士依仗强力横行无忌。 有一个著名的茶师跟随着一个显赫的主人。 有一天主人要去京城办事&#xff0c;舍不得离开茶师&#xff0c;就说&#xff0c;你跟我去吧&#xff0c;好每天给我泡茶。茶师很害怕&#xff0c;对主人…

要男女朋友有什么用?

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

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

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

城管威逼交警“让老百姓笑话”

城管威逼交警“让老百姓笑话” 发表时间:2010-07-05 09:15:42 来源&#xff1a;新华每日电讯我说两句(加入讨论) “给我们车贴罚单&#xff0c;你是不是不想干了&#xff1f;咱都是执法的&#xff0c;这一整&#xff0c;不让老百姓笑话吗&#xff1f;”这是沈阳市一位城管对正…

重点客户销售数据分析python_药品销售数据分析--python

一、数据分析的目的数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。本篇文章中&#xff0c;假设以朝阳医院2018年销售数据为例&#xff0c;目的是了解朝阳医院在2018年里的销售情况&…

C#类与结构体究竟谁快——各种函数调用模式速度评测

以前我一直有个疑惑——在C#中&#xff0c;究竟是类&#xff08;class&#xff09;比较快&#xff0c;还是结构体&#xff08;struct&#xff09;比较快&#xff1f;当时没有深究。 最近我遇到一个难题&#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…

Building a Space Station--POJ 2031

1、题目类型&#xff1a;计算几何&#xff0c;最小生成树。 2、解题思路&#xff1a;&#xff08;1&#xff09;获得所有点路径长度的矩阵map[][]&#xff1b;&#xff08;2&#xff09;利用Prim算法求解最小生成树。 3、注意事项&#xff1a;数学操作&#xff0c;中间值全部用…

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;以让自己更安全并在自己的公司内部…

php 筛选数组,2020-07-24 php 通过数组键值对筛选数组

筛选数组 $listMenuArray([0] > Array([type] > 0[min] > 0)[1] > Array([type] > 1[min] > 1))目标数组 $resArray([0] > Array([id] > 183[type] > 0[min] > 0)[1] > Array([id] > 184[type] > 0[min] > 1)[2] > Array([id] &g…

python省市区三级联动_Django Admin实现三级联动的示例代码(省市区)

通过自定义Admin的模板文件实现省市区的三级联动.要求创建记录时,根据省>市>区的顺序选择依次显示对应数据.修改记录时默认显示已存在的数据.Modelclass Member(models.Model):name models.CharField(max_length100, verbose_name姓名)province models.CharField(max_l…

[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…

2010.7.29 模式对话框

为什么点击ONOK后&#xff0c;对话框上的控件资源会被删除&#xff1f;OnOK做了什么事儿&#xff1f; 假如有一个对话框Class CMyDialog 我在CMyDialog中&#xff0c;声明了一个m_button&#xff0c;然后在OnInitDlg()中create这个buttton&#xff0c;即m_button.create() 然后…