android菜鸟日记2 contentProvider

Android菜鸟日记2

contentProvider
contentProvider的概念:
contentProvider是一种资源包装器。充当抽象列集和数据库中真实的列集之间的媒介。


Android MIME类型的结构(通过getType()获得)
MIME标准结构
父类型/子类型

如果是供应商具有的专用数据格式的话,则为Vnd开头
Ex:Micorsoft excel电子表格 使用子类型vnd.ms-excel标识

一些子类以X开头 这些子类是不必注册的非标准子类型。他们被视为两个协作机构共同定义的私有类型。

Android MIME类型
Android标示这些类型和子类具有非标准的,供应商特定的前缀。
每个内容型的Android MIME类型都具有两种形式:
一种用于单条记录,一种用于多条记录。
单条记录类似于
Vnd.android.cursor.item/vnd.yourcompanyname.contenttype
多条记录类似于
Vnd.android.cursor.dir/vnd.yourcompanyname.contenttype


使用Android MIME的三点注意
1. 类型和子类型对于他们所要标示的内容必须是唯一的。
2. 如果类型和子类型不是标准的则需要在他们前面添加vnd。
3. 他们通常针对具体的需求添加命名空间。


Android内容URI的结构

Content://授权/*/*
Ex:content://authority-name/path-segment1/path-segment2/ect
授权:用于在提供程序的注册表中定位contentProvider。
/notes/23
为每个contentProvider的路径部分2个*称为路径片段。
且 第一部分指向一个对象集合。Ex:/notes表示一个笔记集合或目录
第二部分标示特定的笔记 ex:/23表示特定的笔记


使用:

插入记录:
1. 创建一个contentvalue 对象x
2. 对x赋值(x.put(键,值))
3. 创建一个contentResolver对象c [内容解析器]
4. C.insert(uri, contentvalue) 此方法返回新插入的url地址(方法中的uri为到表的uri)

contentProvider的增删改查
注:对内容的增删改查 是要通过activty获得contentResolver对象,用contentResolver对象执行的。
增contentResolver.insert(uri, contentvalue)
删contentResolver.delect(
Uri uri, /只需到表的uri 行由下面2个决定
String whereClause, /where 字段 ex: id=?
String selction[], /?的内容 ex:23
)
改contentResolver.update(
Uri uri, /只需到表的uri 行由最后2个决定(whereClause, selction[],)
ContentValue value /内容值 是键值对的集合 即放入需更改位置的新值
String whereClause, /where 字段 ex: id=?
String selction[], /?的内容 ex:23
)
查
查是通过contentResolver对象.openOutputStream(url)取得。
描述:contentResolver对象 打开一个输出流对象存放url的内容。


UriMatcher
描述:这是一个URI解析器
工作原理:告诉UriMatcher 实例需要什么样式的URI,然后将唯一编号与这些模式绑定,注册。
注册:
Static{
UriMatcher xxx= new UriMatcher();
xxx.addURI(BookProviderMetaData.AUTHORITY,”books”,asdasdasd)
//(授权,uri尾,唯一编号)
//注册
//授权在BookProviderMetaData定义 [数据库元数据定义类]
}
注册后就可以调用UriMatcher 实例验证uri是否在注册中了
UriMatcher.match(uri)//通过uri找匹配的唯一编号

投影映射概念
概念:contentProvider充当抽象列集和数据库中真实的列集之间的媒介,这些列集可能是不同的。可以借助SQLiteQueryBuilder类来就建立此投影映射。
投影映射将调用方法传入的的查询中的列名称映射到数据库列名称。如果设置投影映射,他必须包含所有可能请求的所有列名称,即使这些列的键,值相同。
方法传入 name 映射到people.name
Ex: sBooksProjectionMap = new HashMap<String,String>();
sBooksProjectionMap.put(方法传入的列名称,映射的数据库列名称)

注册contentProvider[提供程序]
<provider android:name="NotePadProvider"
android:authorities="com.google.provider.NotePad"
/>
描述:
<provider android:name="对应类(在<manifest package
>指定下的类)"
android:authorities="授权"
/>

android:authorities="com.google.provider.NotePad"为对类NotePadProvider的授权定义
只有再Android描述文件中注册的provider才能被使用。可以理解为这段com.google.provider.NotePad对应着NotePadProvider类
授权的概念是:唯一标示字符串,用于分辨内容提供程序[contentProvider]


实现一个ContentProvider

首先实现一个ContentProvider步骤:
1. 计划数据库、url、列名称等,创建元数据类(是另一个类,非ContentProvider扩展类。来定义无所有这些数据元素的常量MIME 列名 创建日期 修改日期等)。
2. 扩展抽象方法ContentProvider。
3. 实现方法query、insert、update、delete、getType
4. 在androidmainifest中注册程序。

getType方法
描述实现ContentProvider的getType()方法
Public string getType(Uri uri)
{
Blablalba……
}
传入uri
然后用sUriMatcher(uri)验证uri
Case入相应的return.(uri到表还是到行)

Query方法
描述:实现ContentProvider的Query ()方法
查询为read操作 需要使用到SQLiteQueryBuilder对象来操作
如果是增删改就不需要此对象字节用SQLiteDatbase 对象相应的操作即可
整体过程为:
1. 实例化SQLiteQueryBuilder对象
2. 对传入的uri通过sUriMatcher分析
2.1若为到表uri则SQLiteQueryBuilder对象setTable()//表 setProjectionMap()//列投影(这个表有什么列)
2.2若为到行uri则SQLiteQueryBuilder对象setTable()//表 setProjectionMap()//列投影(这个表有什么列)appendWhere(BookTableMetaData._ID+”=”+uri.getPathSegments().get(1))
3.验证传入的 sortOrder. 若无则传入默认,若有则赋值为传入的。
4.获得数据库读操作对象。
SQLiteDatabase db =MopernHelper.getReadableDataabase();
5. 调用SQLiteQueryBuilder对象 处理操作
Cursor c=SQLiteQueryBuilder对象.query(db,projection,selection,selectionArgs,null,null,orderBy)
Cursor c 返回(类result) \ db数据库读操作对象 \projection 需要返回的列 \selection where字段 \selectionArgs where字段的值

Insert方法
描述:实现ContentProvider的Insert ()方法将记录插入到基础数据库中,然后返回指向新创建的URI
由于insert为写操作 直接用SQLiteDatbase对象即可。
整体过程为:
1. 对传入的uri通过sUriMatcher分析
1.1若非到表uri则则丢出异常(插入操作uri只能到表不能到行)
2.验证传入的values完整性,不完整则补充之(列,创建时间,last修改时间,主键必须有)。
3.获得写操作对象:
SQLiteDatabase db = mOpernHelper.getWritableDataabase();
3. 调用写操作对象的insert方法插入数据库 此方法返回一个插入出的rowid。
long rowID=Db.insert(表名,主键名,values);
4. 代码使用rowid构造新的uri.
Uri xx = ContentUris.withAppendedID(BookTableMetaData.CONTENT_URI,rowID)

Update方法
描述:实现ContentProvider的Update ()方法 将记录修改一行或者多行数据放回修改的的记录数量。
完整过程:
1. 通过mOpernHelper获得写操作对象
SQLiteDatabase db = mOpernHelper.getWritableDataabase();
2. 对传入的uri通过sUriMatcher分析
1.1若传入到表则执行db.update(tableNAME,valuse,where,whereArgs)
1.2若传入到行则执行db.update(tableNAME,valuse,X写在下面 whereArgs)
// rowid为rowid=uri.getPathSegments().get(1)获取的
X 的内容为:
BookTableMetaData._ID+”=”+rowID+(!TextUtils.isEmpty(where)?”AND(“+where+’)’:””)
意思为表中id=传入uri中id ,where字段不为空则where为空则“”即无。

delete方法
描述:实现ContentProvider的delete ()方法 将记录删除一行或者多行数据放回修改的的记录数量。整体方法与updata十分相似
完整过程:
1.通过mOpernHelper获得写操作对象
SQLiteDatabase db = mOpernHelper.getWritableDataabase();
2. 对传入的uri通过sUriMatcher分析
1.1若传入到表则执行db. delete (tableNAME,valuse,where,whereArgs)
1.2若传入到行则执行db. delete (tableNAME,valuse,X写在下面 whereArgs)
// rowid为rowid=uri.getPathSegments().get(1)获取的
X 的内容为:
BookTableMetaData._ID+”=”+rowID+(!TextUtils.isEmpty(where)?”AND(“+where+’)’:””)
意思为表中id=传入uri中id ,where字段不为空则where为空则“”即无。
//x?a:b
X true则a false 则 b


2011-6-30
poolo
值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏) 这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。 阅读详情

相关推荐

告别手动标注!用ENVI Classic高效搞定高光谱图像语义分割标签(以农业/地物分类为例)

本文详细介绍了如何利用ENVI Classic实现高光谱图像的半自动化智能标注,特别针对农业和地物分类场景。通过光谱特征分析、智能标注技巧和MAT文件转换,显著提升标注效率和质量,助力AI模型训练。

weixin_28694169的博客 251

SQLiteQueryBuilder 是一个构造SQL查询语句的辅助类

8.5.3  使用ContentProvider操作数据日记本实例(4)代码解释:首先得到SQLiteDatabase 的实例,然后得到rowId,最后再调用db.update(DIARY_ TABLE_NAME, values, DiaryColumns._ID + "="+ rowId, null)语句执行更新工作。(4)查寻一条数据的方法:query()。具体实现代码如下所示:@Overri...

本事记的富伟徐 1293

CVPR2021 CenterPoint源码解读:从VoxelNet到两阶段优化的完整实现细节

本文深度解析了CVPR 2021 CenterPoint模型的完整实现细节,从VoxelNet体素化、稀疏卷积Backbone,到基于中心点的检测头与两阶段精修机制。文章提供了从环境搭建、数据预处理到核心代码模块(如热力图生成、关键点特征提取与MLP Refiner)的实战指南,并分享了训练策略、多任务损失调优及可视化调试等关键工程实践,助力开发者深入理解并复现这一高效的3D目标检测框架。

linux的博客 469

【Content Provider】SQLiteQueryBuilder类

http://hi.baidu.com/bvtfbfhvaempsve/item/696ee05696e7433933e0a916

horsttnann的专栏 3409

STM32实战篇:使用USART发送/接收数据

在发送字符时也可以直接使用其对应的ASCLL码,例如: USART_SendData(USART1, 0x61);

qq_74114817的博客 596

grafana使用方法

1、点击仪表盘2、新建仪表盘3、选择数据源4、选择查询的条件5、美化。

2403_87359664的博客 323

[android]layout_weight 在layout_width 为fill_parent 与wrap_content 时的不同含义

  转自:http://hi.baidu.com/ljlkings/blog/item/fa2a59803f839a82f603a6b2.html?timeStamp=1305190390481       我的话: 简单的说weight代表权重 在layout_width =fill_parent 时 组件填充是要尽可能的大 那么权重重的占领的位置就多。[既1的权重比2...

ipoolo的专栏 1341

前端监控性能指标

文章目录前端监控性能指标性能指标阶段性指标关键性能指标小程序W3C Level 1兼容性常规用法注意事项1、计算HTML文档请求使用 Nav Timing2、计算静态资源使用 getEntriesByType('resource') 代替 getEntries()3、secureConnectionStart 问题4、跨域资源设置响应头 Timing-Allow-Origin5、注意属性值为 0 ...

foolbird 1347

[android]动态改变按钮背景状态 StateListDrawable

  动态改变按钮背景状态   很少用到 上次和六哥聊到。六哥有心 查了下  以下是DEMO     public static StateListDrawable setStateListDrawable(Context mActivity, int up, int down) { StateListDrawable stateListDrawable = new Sta...

ipoolo的专栏 453

Zemax中场曲与畸变图的深度解析与应用场景对比

本文深度解析了Zemax中场曲/畸变图与网格畸变图的核心原理、计算逻辑与适用场景。通过对比常规成像镜头、扫描镜头、鱼眼镜头及变形宽银幕镜头等实际案例,详细阐述了如何根据系统对称性、视场角及核心需求选择正确的分析工具与畸变评价标准,为光学设计中的畸变诊断与优化提供清晰指导。

sand8的博客 482

SAP 系统和银行系统通过 SM2 加密算法进行集成

SM2 是基于椭圆曲线离散对数问题(ECDLP)的一种公钥密码算法。椭圆曲线加密的核心原理,是利用了一个数学难题:在椭圆曲线群上,已知曲线上两点的运算结果,逆向推导出这两个点的具体信息是非常困难的。这样的复杂度使得基于椭圆曲线的密码体制比传统的 RSA 更加难以破解。在 SM2 加密中,公钥和私钥的生成与传统的椭圆曲线加密类似。选择一个椭圆曲线和一个基点 P。使用私钥 d,计算公钥 P’ = d * P。私钥 d 保密,而公钥 P’ 可公开分发,用于加密数据。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1211

Android菜鸟日记 26 ListView中放置button

  Android菜鸟日记 26 ListView中放置button   ListView放置button是一个很麻烦的事情 网上说的 一般都是如何实现button 和 listView同时被点击,可视做HDEasyCall 时候更多的需要listview和button不能同时点击。   首先如果想要ListView 里面的button被点击,且listView也能...

ipoolo的专栏 372

AI训练师三级考证避坑指南|假证辨别+机构套路+OSTA验证

这是最基础的问题,也是最容易忽略的问题。人工智能训练师三级证书本身是有价值的——政府认可的职业技能等级证书、多地紧缺工种补贴、人才引进加分。但正因为有价值,才引来了大量骗子。记住三句话OSTA查不到的证,一分钱都不值声称免考包过的,100%是骗子培训费一次性谈清楚,后续加价直接走人如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》99篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1219

[转]Android读取assets目录下的资源

自:http://abc20899.iteye.com/blog/1096620     1。获取资源的输入流 资源文件 sample.txt 位于 $PROJECT_HOME/assets/ 目录下,可以在 Activity 中通过 Context.getAssets().open(“sample.txt”) 方法获取输入流。 注意:如果资源文件是文本文件则需要考虑文件的编码和换行符。建议...

ipoolo的专栏 357

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[android]ViewPage上无法通过onKeyDown()获得按钮事件

系统无法监听到遥控器在VewPage上的按钮事件,如需监听ViewPage 上的按钮事件需要对对应的viewPage的View对象设置setOnkeyListener()来监听。

ipoolo的专栏 276

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[android]使用 Matrix 的随触摸旋转的ImageView

使用 Matrix 的随触摸旋转的ImageView 突然想做个 类似 旋转开关的东西。然后就用了surfaceView做了个一个。 快做完的时候 朋友说道可以使用imageView来实现我想要的效果,然后就研究了下。 几个keypoint点 1.需要设置setScaleType(ScaleType.MATRIX); 2.matrix 需要new出来 通过getImageMatrix...

ipoolo的专栏 238

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[转]android 几何图形的绘制

转自:http://byandby.iteye.com/blog/826418    以前的文章里边画一般都是一些矩形,今天就看看怎么在android手机屏幕上绘制一些几何图形,如三角形、多边形、椭圆、圆形、正方形 等等。并且设置 空心、实心。下面我们先来看看 在android中可以绘制出那些几何图形           方法                               ...

ipoolo的专栏 234

判断SD卡是否存在

android.os.Environment.getExternalStorageState().equals(                      android.os.Environment.MEDIA_MOUNTED)

ipoolo的专栏 225

Android菜鸟日记15-传感器与摄像头

传感器 sensorManager = (SensorManager) getContext().getSystemService( Context.SENSOR_SERVICE); //获得传感器控制器[SensorManager] //getContext()获得环境 //getSystemService(Context.SENSOR_SERVICE);获得系统服务(传感器) ...

ipoolo的专栏 220

android菜鸟日记1

http://ask.lurencun.com 海大知道 Android菜鸟日记 Android 应用程序主要由3部分组成:应用程序描述文件[xml], 各种资源的集合[res], 以及应用程序的源代码。 j2ee 开发与 android发开有高度的类似 j2ee 用标记语言构建view android也是,但Android用的标记语言xml 这种标记语言更好,无需硬编码应用...

ipoolo的专栏 200

[记录]setTag

一、异常: Caused by: java lang IllegalArgumentExcpetion: The key must be an application-specific resource id 一般是由于传入的参数(int型的id值)不是由系统自动生成的(就是位于gen文件夹中的,gen中的id值可以保证唯一性)所导致。 比如方法setTag(int key, Objec...

ipoolo的专栏 198

[转]Android文件管理器介绍

  转自:http://www.linuxidc.com/Linux/2011-10/44521.htm   今天拿这个改了一个 路径选择器 ======================================= 1.     Android文件管理器介绍 Android系统并不自带文件管理器,但是很多情况下,我们有诸如从SD中打开文件的需要,就必须借助三方开发的资源管理器,常...

ipoolo的专栏 191

Android菜鸟日记17-SeekBar的图片效果

Android菜鸟日记17 SeekBar的图片效果 Test.xml 背景 二级进图条图片资源 一级进度条图片资源 SeekBar 拖动条的意思 如果想让SeekBar的拖拉效果为图片的话 只在布局文件中写是不够的。 需要另写一个xml 来定义 Seekbar的 progressDrawable来定义效果[背景、一级进度条效果、二级...

ipoolo的专栏 183

[android]待解决 lisTview 的onItemSelected 监听事件焦点的问题。

今天遇到个问题 到目前为止 一直不理解为什么 大概描述下布局 一个button下面一个listview   当焦点从bt第一次到lv的第一行时候 onItemSelected 被调用, 然后让焦点向上回到BT 再第二次下到LV第一行 时 onItemSelected 就没有被调用了 思前想后不知道原因,最后用了另一种方法绕过去了   另 如何能让对listview上item的o...

ipoolo的专栏 180

iOS 多语言本地化教程,VS Code KXApp 编辑 String Catalog .xcstrings

做 iOS 多语言本地化总要在 VS Code 和 Xcode 之间来回切?这篇讲用 KXApp(快蝎)在 VS Code 里直接编辑 String Catalog(.xcstrings):双击打开和 Xcode 一样的表格,`.xcstrings` 与老的 `.strings`、`.stringsdict` 同表编辑,加语言同步登记到工程、从源码扫描同步新 key,复数、设备变体和变量占位都在表里处理,改源语言文本后已有翻译自动标需复核。文件仍是标准格式,回 Xcode 打开一致。

2501_91592143的博客 158

成为全栈·基础补充·Nginx 入门:反向代理与静态托管

Nginx 可以托管前端静态文件,也可以作为反向代理把 HTTPS 请求转给内部 API。本文从请求路径讲起,解释反向代理、静态目录、代理头、路径拼接、可信 IP、Cookie、上传体积、超时和缓存边界,并提供配置结构示例和逐层排查顺序。配置片段需要结合实际证书、路由和运行平台验证,不能直接复制为生产方案。

FungLeo's Blog 289
上一篇: android菜鸟日记1
下一篇: Android菜鸟日记3 intent
iPoolo
博客等级 码龄17年 2粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值