3dmax 那种类型的文件可以存储 浮点数存储方式数据,想用这些数据表示坐标

数据表示与指令系统 习题答案
数据表示与指令系统 习题答案
  1、数据结构和机器的数据表示之间是什么关系?确定和引入数据表示的基本原则是什么?
  答:数据表示是能由硬件直接识别和引用的数据类型。数据结构反映各种数据元素或信息单元之间的结构关系。数据结构要通过软件映象变换成机器所具有的各种数据表示实现,所以数据表示是数据结构的组成元素。不同的数据表示可为数据结构的实现提供不同的支持,表现在实现效率和方便性不同。数据表示和数据结构是软件、硬件的交界面。
  除基本数据表示不可少外,高级数据表示的引入遵循以下原则:(1)看系统的效率有否提高,是否养活了实现时间和存储空间。(2)看引入这种数据表示后,其通用性和利用率是否高。
  2、标志符数据表示与描述符数据表示有何区别?描述符数据表示与向量数据表示对向量数据结构所提供的支持有什么不同?
  答:标志符数据表示指将数据类型与数据本身直接联系在一起,让机器中每个数所都带类型樗位。其优点是:(1)简化了指令系统和程序设计;(2)简化了编译程序;(3)便于实现一致性校验;(4)能由硬件自动变换数据类型;(5)支持数据库系统的实现与数据类型无关;(6)为软件调试和应用软件开发提供支持。缺点是:(1)会增加程序所点的主存空间;(2)在微观上对机器的性能(运算速度)不利。
  数据描述符指数据的描述与数据分开存放,描述所访问的数据是整块还是单个的,及访问该数据块或数据元素的地址住处它具备标志符数据表示的优点,并减少了标志符数据表示所占的空间,为向量和数组结构的实现提供支持。
  数据描述符方法优于标志符数据表示,数据的描述与数据分开,描述所访问的数据是整块还是单个的,及访问该数据块或数据元素的地址信息,减少了樗符数据表示所占的窨。用描述符方法实现阵列数据的索引比用变址方法实现要方便,且便于检查出程序中的阵列越界错误。但它不能解决向量和数组的高速运算问题。而在有向量、数组数据表示的向量处理机上,硬件上设置有丰富的赂量或阵列运算指令,配有流水或阵列方式处理的高速运算器,不仅能快速形成向量、数组的元素地址,更重要的是便于实现把向量各元素成块预取到中央处理机,用一条向量、数组指令流水或同时对整个向量、数组高速处理.如让硬件越界判断与元素运算并行。这些比起用与向量、阵列无关的机器语言和数据表示串行实现要高效的多。
  3、堆栈型机器与通用寄存器型机器的主要区别是什么?堆栈型机器系统结构为程序调用的哪些操作提供了支持?
  答:有堆栈数据表示的机器称为堆栈机器。它与一般通用寄存器型机器不同。通用寄存器型机器对堆栈数据结构实现的支持是较差的。表现在:(1)堆栈操作的指令少,功能单一;(2)堆栈在存储器内,访问堆栈速度低;(3)堆栈通常只用于保存于程序调用时的返回地址,少量用堆栈实现程序间的参数传递。而堆栈机器为堆栈数据结构的实现提供有力的支持.表现在:(1)有高速寄存器组成的硬件堆栈,并与主存中堆栈区在逻辑上组成整体,使堆栈的访问速度是寄存器的,容量是主存的;(2)丰富的堆栈指令可对堆栈中的数据进行各种运算和处理;(3)有力地支持高级语言的编译;(4)有力地支持子程序的嵌套和递归调用。
  堆栈型机器系统结构有力地支持子程序的嵌套和递归调用。可将以下信息全部压栈,包括:保存子程序的返回地址,保存条件码,保存关键寄存器内容,保存必要的全局型、局部型参数,为子程序开辟存放局部变量和中间结果的工作区。
  4、(1)浮点数系统使用的阶基rp=2,阶值位数p=2,尾数基值rm=10,以rm为基的尾数位数m''=1,按
  照使用的倍数来说,等价于m=4,
  试计算在非负阶、正尾数、规格化情况下的最小尾数值、最大尾数值、最大阶值、可表示的最小
  值和最大值及可表示数的个数。
  (2)对于rp=2,p=2,rm=4,m''=2,重复以上计算。
  解:依题意知列下表:
  p=2,rm=10,m''=1 p=2,rm=4,m''=2
  最小尾数值 10^-1=0.1 4^-1=0.25
  最大尾数值 1-10^-1=0.9 1-4^-2=15/16
  最大阶值 2p^-1=3 3
  可表示的最小值 0.1 0.25
  可表示的最大值 10^3*0.9=900 4^3*15/16=60
  可表示数的总个数 36 48
  不明白题中“按照使用的倍数来说,等价于m=4,” 这句话是什么意思,有什么作用呢?
  5、由4位数(其中最低位为下溢附加位)经ROM查表舍入法,下溢处理成3位结果,设计使下溢下
  处理平均误差接近于零的ROM表,列出ROM编码表地址与内容的对应关系。
  地址 10 01 00 11 10 1111
  内容 000 001 001 010 010 011 011 100 100 101 101 110 110 111 111 111
  6、变址寻址和基址寻址各适用于何种场合?设计一种只用6位地址码就可指向一个大地址空间中
  任意64个地址之一的寻址机构。
  解:基址寻址是对逻辑地址空间到物理地址空间变换的支持,以利于实现程序的动态再定位。
  变址寻址是对数组等数据块运算的支持,以利于循环。
  将大地址空间64个地址分块,用基址寄存器指出程序所在块号,用指令中6位地址码表示该块内64
  个地址之一,这样基址和变址相结合可访问大地址任意64个地址之一。
  7.若某机要求:三地址指令4条,单地址指令255条,零地址指令16条。设指令字长为12位.每个
  地址码长为3位。问能否以扩展操作码为其编码?如果其中单地址指令为254条呢?说明其理由。
  答:①不能用扩展码为其编码。
  ∵指令字长12位,每个地址码占3位;
  ∴三地址指令最多是2^(12-3-3-3)=8条, 现三地址指令需4条,
  ∴可有4条编码作为扩展码,
  ∴单地址指令最多为4×2^3×2^3=2^8=256条,
  现要求单地址指令255条,∴可有一条编码作扩展码
  ∴零地址指令最多为1×2^3=8条
  不满足题目要求
  ∴不可能以扩展码为其编码。
  ②若单地址指令254条,可以用扩展码为其编码。
  ∵依据①中推导,单地址指令中可用2条编码作为扩展码
  ∴零地址指令为2×2^3=16条,满足题目要求
  求单指令时为什么是:
  单地址指令最多为4×2^3×2^3=2^8=256条
  在我看来应是4×2^3,为什么还要再多乘一个2^3呢?
  找到老版主的帖子看了,但还是有点不太明白,如果需多乘一个,那第10题不是少乘一个了吗?
  做第十题时明白些,知道原因,那这题是怎么回事呢?
  望有朋友帮我解惑!谢谢!
  8、某机指令字长16位。设有单地址指令和双地址指令两类。若每个地址字段为6位.且双地址指
  令有X条。问单地址指令最多可以有多少条?
  答:单地址指令最多为(16-X)×2^6
  双地址指令最多是2^(16-6-6)=2^4=16条, 现双地址指令有X条,
  ∴可有(16-X)条编码作为扩展码,
  ∴单地址指令最多为(16-X)×2^6=256条
  9.何谓指令格式的优化?简要列举包括操作码和地址码两部分的指令格式优化可采用的各种途径
  和思路。
  答:指令格式的优化指如何用最短位数表示指令的操作信息和地址信息,使程序中指令的平均字
  长最短。
  为此用到Huffman压缩概念。其基本思想是,当各种事件发生概率不均等时,采用优化技术对
  发生概率最高的事件用最短的位数(时间)来表示(处理),而对出现概率较低的事件,允许采用较
  长位数(时间)来表示(处理),会导致表示(处理)的平均位数(时间)的缩短。
  ①用此思想可对操作码进行优化。首先通过大量已有典型程序进行统计,可得到每种指令在
  程序中出现的概率(使用频度)。然后构造它们的Huffman树。方法如下:
  a)被统计指令按使用频由小到大排列;
  b)每次选择其中最小的二个频度合成一个频度是它们二者之和的新结点,并将该结点按频度
  大小插到余下的未参与结合的频度值中;
  c)如此继续,直至全部频度结合完毕形成根结点。
  最后从根结点开始对每个结点的两个分支分别用0、1表示,则到达各频度指令的代码序列就
  构成该频度指令的Huffman码。
  Huffman码是最优化的编码,但这种编码码长种类太多.不便于译码,不能实用,为此可采用
  下面的扩展操作码编码。扩展操作码编码是介于定长二进制编码和全Huffman编码之间的一种编
  码,仍利用Huffman压缩思想,使操作码平均长度缩短。其操作码长度不定,但只有有限几种码
  长,是一种可实用的优化编码方法。扩展方法应根据指令使用频度pi的分布而定.如pi值在头15
  种指令中都比较大,但在30种指令以后急剧减少,则宜选15/15/15法;若pi值在头8种指令中较
  大,之后的64种指令pi值也不低时,则宜选8/64/512法。衡量标准是哪种编码使平均长度最短。
  ②对地址码的优化:
  操作码的优化表示可以使指令总位数减少,但为不降低访存指令的速度.必须维持指令字按
  整数边界存储,所以首先应考虑地址码也用可变长.让长操作码与短地址码配合.即使是定长指
  令字,也可利用操作码优化腾出的空白。减少存储空间的浪费。如果最常用的操作码最短,其地
  址码个数越多指令功能越强。如为实现A+B→C,若采用单地址指令需经取A,加B,送C三条指令
  完成,而用了三地址指令只需一条,减少程序占用空间。
  其次考虑多<
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&基本数据类型_Java编程-织梦者
当前位置:&>&&>& > 基本数据类型
基本数据类型
Java中的基本数据类型分为四类,整数类型,浮点类型,字符类型,布尔类型。
1),整数类型包含byte(一个字节),short(两个字节),int(四个字节),long(8个字节)。
2),浮点类型包含float(四个字节),double(八个字节)。
3),字符类型包含char(两个字节)。
4),布尔类型包含boolean(一般情况下八位字节)。
通常说的整型,一般包含下面4种类型,byte(一个字节),short(两个字节),int(四个字节),long(8个字节)。
int是最常用的整数类型,这里要注意int的取&#20540;范围,--&,为了方便记忆,以后可以简单地记:int是2开头的10位数字。
通常情况下,直接给出一个整数&#20540;默认&#20540;就是int类型。除此之外,有如下两种情形必须指出:
1),如果直接将一个较小的整数&#20540;(在byte和short类型的表示范围内)赋给一个byte和short变量,系统会自动把这个整数&#20540;当成byte或者short类型来处理。
2),如果使用一个巨大的整数&#20540;(超过了int类型的表示范围时),Java不会自动把这个整数&#20540;当成long类型来处理。
如果希望系统把一个整数&#20540;当成long类型来处理时,应在这个整数&#20540;后增加l或者L作为后缀,推荐使用L。
注意:可以把一个较小的整数&#20540;(在int类型的表示范围内)直接赋给一个long类型的变量,这并不是因为Java会把这个较小的整数&#20540;当成long类型来处理。
Java依然把这个整数&#20540;当成int类型来处理,只是因为int类型的&#20540;会自动类型转换到long类型。
public static void main(String[] args)
// 下面语句正确,5在byte类型范围内,系统自动把5当成byte类型来处理。
byte a = 5;
// 下面语句错误,超出了类型的范围(2开头10位数字)。
// 下面语句错误,系统不会自动把当成long类型来处理
long c = ;
// 下面语句正确,long类型要在数字后面加L。
long d = L;
// 下面2行语句正确,Java中的int类型会自动转成long类型
int e = 123;
字符型通常用于表示单个的字符,字符型&#20540;必须使用单引号括起来。
Java使用16位的Unicode字符集作为编码方式,Unicode被设计成支持世界上所有书面语言的字符,包括中文字符,所以Java程序支持各种语言的字符。
字符型&#20540;有如下三种表示形式:
1),直接通过单个字符来指定字符型&#20540;,比如'A','9','0'等。
2),通过转义字符表示特殊字符型&#20540;,比如'\n','\t'等。
3),直接使用Unicode&#20540;来表示字符型&#20540;,&#26684;式是'\uXXXX',其中XXXX代表一个十六进制的整数。
由于计算机底层保存字符时,实际上保存该字符对应的编号,因此char类型的&#20540;也可以直接作为整数&#20540;来使用,它相当于一个16位的无符号整数,范围是0-&65535。
如果把0-&65535范围内的一个int整数赋给char类型变量,系统会自动把这个int整数当成char类型来处理。
public static void main(String[] args)
char charValue = &#39;蒋&#39;;
// 下面代码输出 蒋
System.out.println(charValue);
int intValue = charV
// 下面代码输出 33931
System.out.println(intValue);
Java没有提供表示字符串的基本数据类型,而是通过String类来表示字符串,由于字符串由多个字符组成,因此字符串要使用双括号括起来。
有两点需要注意:
1),char类型使用单引号括起来,而字符串使用双括号括起来。关于String的用法后面我会专门做整理的。
2),Java语言中的单引号,双引号和反斜线都有特殊的用途,如果一个字符串包含了这些特殊字符,则应该使用转义字符的表示形式。
比如Java中写一个绝对路径:&c:\codes&这种写法得不到期望的结果,因为Java会把反斜线当成转义字符,所以应该写成&c:\\codes&。
Java的浮点类型有两种,float和double。Java的浮点类型有固定的表数范围和字段长度,字段长度和表数范围与机器无关。
浮点类型包含float(四个字节)占32位的内存空间,double(八个字节)占64位的内存空间。
Java语言的浮点数有两种表示形式。
1),十进制数形式:这种形式就是简单的浮点数,比如3.1415。浮点数必须包含一个小数点,否则会被当成int类型处理。
2),科学计数法形式:比如3.14e2/3.14E2,也就是3.14*10*10,原谅我Mac不会打指数。
注意:只有浮点类型的数&#20540;才可以使用科学计数法形式表示。比如31400是一个int类型的&#20540;,而314E2则是浮点类型的&#20540;。
Java语言的浮点类型默认的是double类型,可以在一个浮点数后添加d或者D,强制指定该变量是double类型。
如果希望Java把一个浮点类型&#20540;当成float类型处理,应该在这个浮点类型&#20540;后紧跟f或者F。
Java还提供了三个特殊的浮点数&#20540;,正无穷大,负无穷大,非数,用来表示溢出和出错。
1),正无穷大通过Double和Float类的POSITIVE_INFINITY表示,比如用一个正数除以0将得到正无穷大
2),负无穷大通过Double和Float类的NEGATIVE_INFINITY表示,比如使用一个负数除以0将得到负无穷大
3),非数通过Double和Float类的NaN表示,0除以0或者对一个负数开方将得到一个非数
有2点需要注意:
1),所有的正无穷大数&#20540;都是相等的,所有的负无穷大数&#20540;都是相等的,而NaN不与任何数&#20540;相等,甚至和NaN都不相等。
2),只有浮点数除以0才可以得到正无穷大或负无穷大。Java语言会自动把和浮点数运算的0当成0.0处理。
如果一个整数&#20540;除以0,则会抛出一个异常,ArithmeticException:/by zero(除以0异常)。
以下代码是JDK中Double类中正无穷大,负无穷大,非数的源码:
public final class Double extends Number implements Comparable&Double& {
* A constant holding the positive infinity of type
* {@code double}. It is equal to the value returned by
* {@code Double.longBitsToDouble(0x7ff0L)}.
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
* A constant holding the negative infinity of type
* {@code double}. It is equal to the value returned by
* {@code Double.longBitsToDouble(0xfff0L)}.
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
* A constant holding a Not-a-Number (NaN) value of type
* {@code double}. It is equivalent to the value returned by
* {@code Double.longBitsToDouble(0x7ff0L)}.
public static final double NaN = 0.0d / 0.0;
现在我们输出一下正无穷大,负无穷大,非数,看下控制台显示。
public static void main(String[] args)
System.out.println(&正无穷大:& + Double.POSITIVE_INFINITY);
System.out.println(&负无穷大:& + Double.NEGATIVE_INFINITY);
System.out.println(&非数:& + Double.NaN);
}控制台输出如下:
正无穷大:Infinity
负无穷大:-Infinity
布尔型只有一个boolean类型,用来表示逻辑上的真或假。
Java中,boolean类型的数&#20540;只能是true或false,不能用0或者非0来代表,其他基本数据类型的&#20540;也不能转换成boolean类型。
boolean类型的&#20540;或变量主要用来做旗标进行流程控制,Java语言中使用boolean类型的变量或&#20540;控制的流程主要有如下几种:
1),if条件控制语句
2),while循环控制语句
3),do循环控制语句
4),for循环控制语句
5),(?:)三目运算符
5,数&#20540;中使用下划线分隔
当程序中用到的数&#20540;位数特别多时,我们不容易看清楚变量到底有多少位数。
为了解决这个问题,Java7引入了一个新功能,程序员可以在数&#20540;中使用下划线,不管是整数数&#20540;,还是浮点型数&#20540;,都可以自由的使用下划线。
通过下划线,可以更直观的分辨数&#20540;中到底包含多少位,建议3位数字用一个下划线,比如1_234_567_890。
public static void main(String[] args)
int a = 123_456_789;
System.out.println(&使用下划线划开int值:& + a);
long b = 1_234_567_890_987_654_321L;
System.out.println(&使用下划线划开long值:& + b);
以上就是基本数据类型的全文介绍,希望对您学习和使用java程序开发有所帮助.
这些内容可能对你也有帮助
更多可查看Java编程列表页。
猜您也会喜欢这些文章南开《3D游戏软件设计》作业2014_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
南开《3D游戏软件设计》作业2014
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
你可能喜欢君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
利用3DMAX获取任意三维空间曲线坐标数据文件
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Android五种实现数据存储技术详解
Android五种实现数据存储技术详解
  第一种:&使用SharedPreferences存储数据
  SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中
重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长
整形、Int整形、String字符串型的保存。&
  它是什么样的处理方式呢?
SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最终是以xml方式来保存,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml
处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。
  它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
  其存储位置在/data/data/&包名&/shared_prefs目录下。
  SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
  实现SharedPreferences存储的步骤如下:
  一、根据Context获取SharedPreferences对象
  二、利用edit()方法获取Editor对象。
  三、通过Editor对象存储key-value键值对数据。
  四、通过commit()方法提交数据。
  下面是示例代码:
  publicclass&MainActivity&extends&Activity&{&&&&&  &@Override  &&&&&publicvoid&onCreate(Bundle&savedInstanceState)&{&  &&&&&&&&super.onCreate(savedInstanceState);&  &&&&&&&&setContentView(R.layout.main);&  &&&&&&&&//获取SharedPreferences对象  &&&&&&&&Context&ctx&=&MainActivity.&&&&&&&&  &&&&&&&&SharedPreferences&sp&=&ctx.getSharedPreferences(&SP&,&MODE_PRIVATE);&  &&&&&&&&//存入数据  &&&&&&&&Editor&editor&=&sp.edit();&  &&&&&&&&editor.putString(&STRING_KEY&,&&string&);&  &&&&&&&&editor.putInt(&INT_KEY&,&0);&  &&&&&&&&editor.putBoolean(&BOOLEAN_KEY&,&true);&  &&&&&&&&mit();&  &&&&&&&&//返回STRING_KEY的值  &&&&&&&&Log.d(&SP&,&sp.getString(&STRING_KEY&,&&none&));&  &&&&&&&&//如果NOT_EXIST不存在,则返回值为&none&  &&&&&&&&Log.d(&SP&,&sp.getString(&NOT_EXIST&,&&none&));&  &&&&&}&  }&&&
  这段代码执行过后,即在/data/data/com.test/shared_prefs目录下生成了一个SP.xml文件,一个应用可以创建多个这样的xml文件。&
  SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。&
  第二种:
文件存储数据
  关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
  文件可用来存放大量数据,如文本、图片、音频等。
  默认位置:/data/data/&包&/files/***.***。
  代码示例:
  publicvoid&save()&  {&  &&&&&&&try&{&  &&&&&&&&&&&FileOutputStream&outStream=this.openFileOutput(&a.txt&,Context.MODE_WORLD_READABLE);&  &&&&&&&&&&&outStream.write(text.getText().toString().getBytes());&  &&&&&&&&&&&outStream.close();&  &&&&&&&&&&&Toast.makeText(MyActivity.this,&Saved&,Toast.LENGTH_LONG).show();&  &&&&&&&}&catch&(FileNotFoundException&e)&{&  &&&&&&&&&&&&  &&&&&&&}&  &&&&&&&catch&(IOException&e){&  &&&&&&&&&&&return&;&  &&&&&&&}&  }&&
  openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符&/& ,如果文件不存在,Android 会自动创建它。
  创建的文件保存在/data/data/&package
name&/files目录,如: /data/data/cn.itcast.action/files/itcast.txt
,通过点击Eclipse菜单&Window&-&Show View&-&Other&,在对话窗口中展开android文件夹,选择下面的File
Explorer视图,然后在File Explorer视图中展开/data/data/&package
name&/files目录就可以看到该文件。
  openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
  Context.MODE_PRIVATE
  Context.MODE_APPEND
  Context.MODE_WORLD_READABLE
  Context.MODE_WORLD_WRITEABLE
  Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
  Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
  Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
  MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
  MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
  如果希望文件被其他应用读和写,可以传入:
openFileOutput(&itcast.txt&, Context.MODE_WORLD_READABLE +
Context.MODE_WORLD_WRITEABLE);
android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/&package
name&/files),其他程序无法访问。
  除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE
,只有这样其他程序才能正确访问。
  读取文件示例:
  publicvoid&load()&  {&  &&&&try&{&  &&&&&&&&FileInputStream&inStream=this.openFileInput(&a.txt&);&  &&&&&&&&ByteArrayOutputStream&stream=new&ByteArrayOutputStream();&  &&&&&&&&byte[]&buffer=newbyte[1024];&  &&&&&&&&int&length=-1;&  &&&&while((length=inStream.read(buffer))!=-1)&&&{&  &&&&&&&&&&&&stream.write(buffer,0,length);&  &&&&&&&&}&  &&&&&&&&stream.close();&  &&&&&&&&inStream.close();&  &&&&&&&&text.setText(stream.toString());&  &&&&&&&&Toast.makeText(MyActivity.this,&Loaded&,Toast.LENGTH_LONG).show();&  &&&&}&catch&(FileNotFoundException&e)&{&  &&&&&&&&e.printStackTrace();&  &&&&}&  &&&&catch&(IOException&e){&  &&&&&&&&return&;&  &&&&}&  }&&&
  对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
  Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/&package name&/cache目录
getFilesDir()方法用于获取/data/data/&package name&/files目录。
  把文件存入SDCard:
  使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。
  SDCard是干什么的?你可以把它看作是移动硬盘或U盘。
在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。
  创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:
在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:
mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中访问SDCard,你需要申请访问SDCard的权限。
  在AndroidManifest.xml中加入访问SDCard的权限如下:
  &!--&在SDCard中创建与删除文件权限&--&&  &&&&&uses-permission&android:name=&android.permission.MOUNT_UNMOUNT_FILESYSTEMS&/&&  &&&&&!--&往SDCard写入数据权限&--&&  &&&&&uses-permission&android:name=&android.permission.WRITE_EXTERNAL_STORAGE&/&&&
  要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
  注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限。
  if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){&&  &&&&File&sdCardDir&=&Environment.getExternalStorageDirectory();//获取SDCard目录&&&&&&&&&  &&&&File&saveFile&=&new&File(sdCardDir,&&a.txt&);&  &&&&&&&&FileOutputStream&outStream&=&new&FileOutputStream(saveFile);&  &&&&&&&&outStream.write(&test&.getBytes());&  &&&&&&&&outStream.close();&  }&&
  Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。&&&  &&&&Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:&&  &&&&File&sdCardDir&=&new&File(&/sdcard&);&//获取SDCard目录&  &&&&File&saveFile&=&new&File(sdCardDir,&&itcast.txt&);&&  &&&&//上面两句代码可以合成一句:&  &&&&File&saveFile&=&new&File(&/sdcard/a.txt&);&&  &&&&FileOutputStream&outStream&=&new&FileOutputStream(saveFile);&&  &&&&outStream.write(&test&.getBytes());&&  &&&&outStream.close();&
  第三种:&SQLite数据库存储数据
  SQLite是轻量级嵌入式数据库引擎,它支持
SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了
SQLite.SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展
SQLite 的内核变得更加方便。
  特点:
  面向资源有限的设备,
  没有服务器进程,
  所有数据存放在同一文件中跨平台,
  可自由复制。
  SQLite
内部结构:
  SQLite 基本上符合
SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。 &
  SQLite
和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE
语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite
会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite
称这为&弱类型&(manifest typing.)。 此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY
constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER
TABLE 功能。 除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。
  Android 集成了
SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite
  对于熟悉 SQL
的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC
对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些
  数据库存储在 data/&
项目文件夹 &/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content
Provider 或者 Service 访问一个数据库。
  下面会详细讲解如果创建数据库,添加数据和查询数据库。
创建数据库 Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。
  Android 提供了
SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper
类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。
  SQLiteOpenHelper
的子类,至少需要实现三个方法:
  1&构造函数,调用父类
SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是
Null),一个代表你正在使用的数据库模型版本的整数。
  2&onCreate()方法,它需要一个
SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
  3&onUpgrage()
方法,它需要三个参数,一个 SQLiteDatabase
对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
  下面示例代码展示了如何继承
SQLiteOpenHelper 创建数据库:
  publicclass&DatabaseHelper&extends&SQLiteOpenHelper&{&&&&&  &&DatabaseHelper(Context&context,&String&name,&CursorFactory&cursorFactory,&int&version)&&  &&{&&&&&&  &&&&super(context,&name,&cursorFactory,&version);&&&&&&  &&&&&}&&&&&&  &&&&&@Override  &&&&&publicvoid&onCreate(SQLiteDatabase&db)&{&&&&&&  &&&&&&&&&//&TODO&创建数据库后,对数据库的操作&&&&&  &&&&&}&&&&&&  &&&&&@Override  &publicvoid&onUpgrade(SQLiteDatabase&db,&int&oldVersion,&int&newVersion)&{&&&&&&  &&&&&&&&&//&TODO&更改数据库版本的操作&&&&&  &&&&&}&&&&&&  &@Override  &publicvoid&onOpen(SQLiteDatabase&db)&{&&&&&&  &&&&&&&&&super.onOpen(db);&&&&&&&&  &&&&&&&&&//&TODO&每次成功打开数据库后首先被执行&&&&&  &&&&&}&&&&&&  &}&&&&&&
  接下来讨论具体如何创建表、插入数据、删除表等等。调用 getReadableDatabase() 或 getWriteableDatabase()
方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容:
  db=(new&DatabaseHelper(getContext())).getWritableDatabase();&  &&&&&&&return&(db&==&null)&?&false&:&&&&
  上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,你就可以查询或者修改数据库。 当你完成了对数据库的操作(例如你的 Activity
已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。 创建表和索引 为了创建表和索引,需要调用
SQLiteDatabase 的 execSQL() 方法来执行 DDL 语句。如果没有异常,这个方法没有返回值。&
  例如,你可以执行如下代码:
  db.execSQL(&CREATE&TABLE&mytable&(_id&INTEGER&PRIMARY&KEY&AUTOINCREMENT,&title&TEXT,&value&REAL);&);&&
  这条语句会创建一个名为
mytable 的表,表有一个列名为 _id,并且是主键,这列的值是会自动增长的整数(例如,当你插入一行时,SQLite
会给这列自动赋值),另外还有两列:title( 字符 ) 和 value( 浮点数 )。 SQLite 会自动为主键列创建索引。
通常情况下,第一次创建数据库时创建了表和索引。
  如果你不需要改变表的
schema,不需要删除表和索引 . 删除表和索引,需要使用 execSQL() 方法调用 DROP INDEX 和 DROP TABLE 语句。 给表添加数据
上面的代码,已经创建了数据库和表,现在需要给表添加数据。有两种方法可以给表添加数据。
  像上面创建表一样,你可以使用
execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。execSQL() 方法适用于所有不返回结果的 SQL
  例如:
db.execSQL(&INSERT INTO widgets (name, inventory)&+ &VALUES ('Sprocket',
  另一种方法是使用
SQLiteDatabase 对象的 insert(), update(), delete() 方法。这些方法把 SQL 语句的一部分作为参数。
  示例如下:
  ContentValues&cv=new&ContentValues();&&  &&&&cv.put(Constants.TITLE,&&example&title&);&&  &&&&cv.put(Constants.VALUE,&SensorManager.GRAVITY_DEATH_STAR_I);&&  &&&&db.insert(&mytable&,&getNullColumnHack(),&cv);&&
  update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE
语句的字符串,这些字符串会替换 WHERE 条件中的&?&标记。
  update()
根据条件,更新指定列的值,所以用 execSQL() 方法可以达到同样的目的。 WHERE 条件和其参数和用过的其他 SQL APIs 类似。
  例如:
  String[]
parms=new String[] {&this is a string&};
  db.update(&widgets&,
replacements, &name=?&, parms);
  delete() 方法的使用和
update() 类似,使用表名,可选的 WHERE 条件和相应的填充 WHERE 条件的字符串。 查询数据库 类似 INSERT, UPDATE,
DELETE,有两种方法使用 SELECT 从 SQLite 数据库检索数据。 &
  1 .使用 rawQuery()
直接调用 SELECT 语句; 使用 query() 方法构建一个查询。
  Raw Queries 正如
API 名字,rawQuery() 是最简单的解决方法。通过这个方法你就可以调用 SQL SELECT 语句。
  例如: Cursor
c=db.rawQuery( &SELECT name FROM sqlite_master WHERE type='table' AND
name='mytable'&, null);
  在上面例子中,我们查询
SQLite 系统表(sqlite_master)检查 table 表是否存在。返回值是一个 cursor 对象,这个对象的方法可以迭代查询结果。
如果查询是动态的,使用这个方法就会非常复杂。
  例如,当你需要查询的列在程序编译的时候不能确定,这时候使用
query() 方法会方便很多。
  Regular Queries
query() 方法用 SELECT 语句段构建查询。SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE
条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。 除了表名,其他参数可以是
null。所以,以前的代码段可以可写成:
  String[]&columns={&ID&,&&inventory&};   
  String[]&parms={&snicklefritz&};&&  &Cursor&result=db.query(&widgets&,&columns,&&name=?&,parms,&null,&null,&null);&&&&
  使用游标 &
  不管你如何执行查询,都会返回一个
Cursor,这是 Android 的 SQLite 数据库游标,
  使用游标,你可以:
  通过使用 getCount()
方法得到结果集中有多少记录;
  通过 moveToFirst(),
moveToNext(), 和 isAfterLast() 方法遍历所有记录;
getColumnNames() 得到字段名;
getColumnIndex() 转换成字段号;
getString(),getInt() 等方法得到给定字段当前记录的值;
  通过 requery()
方法重新执行查询得到游标;
  通过 close()
方法释放游标资源;
  例如,下面代码遍历 mytable
  Cursor&result=db.rawQuery(&SELECT&ID,&name,&inventory&FROM&mytable&);&&&&&&  result.moveToFirst();&&  &&&&while&(!result.isAfterLast())&{&&  &&&&&&&&int&id=result.getInt(0);&&  &&&&&&&&String&name=result.getString(1);&&  &&&&&&&&int&inventory=result.getInt(2);&&  &&&&&&&&//&do&something&useful&with&these&  &&&&&&&&result.moveToNext();&&  &&&&&&}&&  &result.close();&&&
  在 Android 中使用 SQLite 数据库管理工具 在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的
  使用 Android
模拟器,有两种可供选择的方法来管理数据库。
  首先,模拟器绑定了 sqlite3
控制台程序,可以使用 adb shell 命令来调用他。只要你进入了模拟器的 shell,在数据库的路径执行 sqlite3 命令就可以了。
  数据库文件一般存放在:
/data/data/your.app.package/databases/your-db-name
如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用 SQLite-aware
客户端来操作它。这样的话,你在一个数据库的拷贝上操作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。
  把数据库从设备上考出来,你可以使用
adb pull 命令(或者在 IDE 上做相应操作)。
  存储一个修改过的数据库到设备上,使用
adb push 命令。 一个最方便的 SQLite 客户端是 FireFox SQLite Manager 扩展,它可以跨所有平台使用。
  下图是SQLite
Manager工具:
  如果你想要开发 Android
应用程序,一定需要在 Android 上存储数据,使用 SQLite 数据库是一种非常好的选择。&
  第四种:
使用ContentProvider存储数据
  Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。那这个时候有读者就会提出问题,难道两个程序之间就没有办法对于数据进行交换?Android这么优秀的系统不会让这种情况发生的。解决这个问题主要靠ContentProvider。一个Content
Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content
Provider的各种数据类型。也就是说,一个程序可以通过实现一个Content
Provider的抽象接口将自己的数据暴露出去。外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及一些权限的问题。&
  一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProviders是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个&数据库&。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的&数据库&。&
  Content
Provider提供了一种多应用间数据共享的方式,比如:联系人信息可以被多个应用程序访问。
  Content
Provider是个实现了一组用于提供其他应用程序存取数据的标准方法的类。 应用程序可以在Content Provider中执行如下操作: 查询数据 修改数据
添加数据 删除数据
  标准的Content
Provider: Android提供了一些已经在系统中实现的标准Content Provider,比如联系人信息,图片库等等,你可以用这些Content
Provider来访问设备上存储的联系人信息,图片等等。
  查询记录:
  在Content
Provider中使用的查询字符串有别于标准的SQL查询。很多诸如select, add, delete,
modify等操作我们都使用一种特殊的URI来进行,这种URI由3个部分组成, &content://&, 代表数据的路径,和一个可选的标识数据的ID。
  以下是一些示例URI:
  content://media/internal/images
这个URI将返回设备上存储的所有图片
  content://contacts/people/
这个URI将返回设备上的所有联系人信息
  content://contacts/people/45
这个URI返回单个结果(联系人信息中ID为45的联系人记录)
  尽管这种查询字符串格式很常见,但是它看起来还是有点令人迷惑。为此,Android提供一系列的帮助类(在android.provider包下),里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让我们理解一点,参见下例:
  MediaStore.Images.Media.INTERNAL_CONTENT_URI
Contacts.People.CONTENT_URI
  因此,如上面content://contacts/people/45这个URI就可以写成如下形式:
  Uri person =
ContentUris.withAppendedId(People.CONTENT_URI, 45);
  然后执行数据查询: Cursor
cur = managedQuery(person, null, null, null);
  这个查询返回一个包含所有数据字段的游标,我们可以通过迭代这个游标来获取所有的数据:
  package&com.wissen.testA&  publicclass&ContentProviderDemo&extends&Activity&{&  &&&&@Override  &&&&publicvoid&onCreate(Bundle&savedInstanceState)&{&  &&&&&&&&super.onCreate(savedInstanceState);&  &&&&&&&&setContentView(R.layout.main);&  &&&&&&&displayRecords();&  &&&&}&  &&&&privatevoid&displayRecords()&{&  &&&&&&&&//该数组中包含了所有要返回的字段  &&&&&String&columns[]&=&new&String[]&{&People.NAME,&People.NUMBER&};&  &&&&&&&Uri&mContacts&=&People.CONTENT_URI;&  &&&&&&&Cursor&cur&=&managedQuery(&  &&&&&&&&&&&mContacts,&  &&&&&&&&&&columns,&&//&要返回的数据字段  &&&&&&&null,&&&&&&&&&&//&WHERE子句  &&&&&&&null,&&&&&&&&&//&WHERE&子句的参数  &&&&&&&null//&Order-by子句  &&&&&);&  &&&&&&&if&(cur.moveToFirst())&{&  &&&&&&&&&&&String&name&=&&  &&&&&&&&&&&String&phoneNo&=&&  &&&&&&&&&&&do&{&  &&&&&&&&&&&&&&//&获取字段的值  &&&&&&&&&name&=&cur.getString(cur.getColumnIndex(People.NAME));&  &&&&&&&&&&&&&phoneNo&=&cur.getString(cur.getColumnIndex(People.NUMBER));&  &&&&&&&&&&&&&Toast.makeText(this,&name&+&&&&&+&phoneNo,&Toast.LENGTH_LONG).show();&  &&&&&&&&&&}&while&(cur.moveToNext());&  &&&&&&&}&  &&&&}&  }&&
  上例示范了一个如何依次读取联系人信息表中的指定数据列name和number。&
  修改记录:
  我们可以使用ContentResolver.update()方法来修改数据,我们来写一个修改数据的方法:
  privatevoid&updateRecord(int&recNo,&String&name)&{&  &&&&&&&&&Uri&uri&=&ContentUris.withAppendedId(People.CONTENT_URI,&recNo);&  &&&&&&&&&ContentValues&values&=&new&ContentValues();&  &&&&&&&&&values.put(People.NAME,&name);&  &&&&&&&&&getContentResolver().update(uri,&values,&null,&null);&  &&&&}&&&
  现在你可以调用上面的方法来更新指定记录: updateRecord(10, &XYZ&); //更改第10条记录的name字段值为&XYZ& &
  添加记录:
  要增加记录,我们可以调用ContentResolver.insert()方法,该方法接受一个要增加的记录的目标URI,以及一个包含了新记录值的Map对象,调用后的返回值是新记录的URI,包含记录号。
  上面的例子中我们都是基于联系人信息簿这个标准的Content
Provider,现在我们继续来创建一个insertRecord() 方法以对联系人信息簿中进行数据的添加:
  privatevoid&insertRecords(String&name,&String&phoneNo)&{&  &&&&ContentValues&values&=&new&ContentValues();&  &&&&values.put(People.NAME,&name);&  &&&&Uri&uri&=&getContentResolver().insert(People.CONTENT_URI,&values);&  &&&&Log.d(&ANDROID&,&uri.toString());&  &&&&Uri&numberUri&=&Uri.withAppendedPath(uri,&People.Phones.CONTENT_DIRECTORY);&  &&&&values.clear();&  &&&&values.put(Contacts.Phones.TYPE,&People.Phones.TYPE_MOBILE);&  &&&&values.put(People.NUMBER,&phoneNo);&  &&&&getContentResolver().insert(numberUri,&values);&  }&&&
  这样我们就可以调用insertRecords(name, phoneNo)的方式来向联系人信息簿中添加联系人姓名和电话号码。 &
  删除记录:
  Content
Provider中的getContextResolver.delete()方法可以用来删除记录。
  下面的记录用来删除设备上所有的联系人信息:
  privatevoid&deleteRecords()&{&&  &Uri&uri&=&People.CONTENT_URI;&&  &getContentResolver().delete(uri,&null,&null);&&  &&&&}&&
  你也可以指定WHERE条件语句来删除特定的记录:
  getContentResolver().delete(uri,
&NAME=& + &&XYZ XYZ&&, null);
  这将会删除name为&XYZ
XYZ&的记录。
  创建Content
Provider: &
  至此我们已经知道如何使用Content
Provider了,现在让我们来看下如何自己创建一个Content Provider。
  要创建我们自己的Content
Provider的话,我们需要遵循以下几步:
创建一个继承了ContentProvider父类的类
定义一个名为CONTENT_URI,并且是public static
final的Uri类型的类变量,你必须为其指定一个唯一的字符串值,最好的方案是以类的全名称,
  如: public static
final Uri CONTENT_URI = Uri.parse(
&content://com.google.android.MyContentProvider&);
创建你的数据存储系统。大多数Content Provider使用Android文件系统或SQLite数据库来保持数据,但是你也可以以任何你想要的方式来存储。
定义你要返回给客户端的数据列名。如果你正在使用Android数据库,则数据列的使用方式就和你以往所熟悉的其他数据库一样。但是,你必须为其定义一个叫_id的列,它用来表示每条记录的唯一性。
如果你要存储字节型数据,比如位图文件等,那保存该数据的数据列其实是一个表示实际保存文件的URI字符串,客户端通过它来读取对应的文件数据,处理这种数据类型的Content
Provider需要实现一个名为_data的字段,_data字段列出了该文件在Android文件系统上的精确路径。这个字段不仅是供客户端使用,而且也可以供ContentResolver使用。客户端可以调用ContentResolver.openOutputStream()方法来处理该URI指向的文件资源,如果是ContentResolver本身的话,由于其持有的权限比客户端要高,所以它能直接访问该数据文件。
  6. 声明public
static String型的变量,用于指定要从游标处返回的数据列。
查询返回一个Cursor类型的对象。所有执行写操作的方法如insert(), update()
以及delete()都将被监听。我们可以通过使用ContentResover().notifyChange()方法来通知监听器关于数据更新的信息。
在AndroidMenifest.xml中使用标签来设置Content Provider。
如果你要处理的数据类型是一种比较新的类型,你就必须先定义一个新的MIME类型,以供ContentProvider.geType(url)来返回。
  MIME类型有两种形式:
  一种是为指定的单个记录的,还有一种是为多条记录的。这里给出一种常用的格式:
vnd.android.cursor.item/vnd.yourcompanyname.contenttype (单个记录的MIME类型) 比如,
一个请求列车信息的URI如content://com.example.transportationprovider/trains/122
可能就会返回typevnd.android.cursor.item/vnd.example.rail这样一个MIME类型。
  vnd.android.cursor.dir/vnd.yourcompanyname.contenttype
(多个记录的MIME类型) 比如,
一个请求所有列车信息的URI如content://com.example.transportationprovider/trains
可能就会返回vnd.android.cursor.dir/vnd.example.rail这样一个MIME 类型。
  下列代码将创建一个Content
Provider,它仅仅是存储用户名称并显示所有的用户名称(使用 SQLLite数据库存储这些数据):
  package&com.wissen.testA&  publicclass&MyUsers&{&  &&&&publicstaticfinal&String&AUTHORITY&&=&&com.wissen.MyContentProvider&;&  &&&&//&BaseColumn类中已经包含了&_id字段  &&&publicstaticfinalclass&User&implements&BaseColumns&{&  &&&&&&&&publicstaticfinal&Uri&CONTENT_URI&&=&Uri.parse(&content://com.wissen.MyContentProvider&);  &&&&&&&&//&表数据列  &&&&&publicstaticfinal&String&&USER_NAME&&=&&USER_NAME&;&  &&&&}&  }&&&
  上面的类中定义了Content
Provider的CONTENT_URI,以及数据列。下面我们将定义基于上面的类来定义实际的Content Provider类:
  package&com.wissen.testApp.&  publicclass&MyContentProvider&extends&ContentProvider&{&  &&&&private&SQLiteDatabase&&&&&sqlDB;&  &&&&private&DatabaseHelper&&&&dbH&  &&&&privatestaticfinal&String&&DATABASE_NAME&&&&&=&&Users.db&;&  &&&&privatestaticfinalint&&&&&&&&DATABASE_VERSION&&&&&&&&&=&1;&  &&&&privatestaticfinal&String&TABLE_NAME&&&=&&User&;&  &&&&privatestaticfinal&String&TAG&=&&MyContentProvider&;&  &&&&privatestaticclass&DatabaseHelper&extends&SQLiteOpenHelper&{&  &&&&&&&&DatabaseHelper(Context&context)&{&  &&&&&&&&&&&&super(context,&DATABASE_NAME,&null,&DATABASE_VERSION);&  &&&&&&&&}&  &&&&&&&&@Override  &&&&&&&&publicvoid&onCreate(SQLiteDatabase&db)&{&  &&&&&&&&&&&&//创建用于存储数据的表  &&&&&&&&db.execSQL(&Create&table&&&+&TABLE_NAME&+&&(&_id&INTEGER&PRIMARY&KEY&AUTOINCREMENT,&USER_NAME&TEXT);&);&  &&&&&&&&}&  &&&&&&&&@Override  &&&&&&&&publicvoid&onUpgrade(SQLiteDatabase&db,&int&oldVersion,&int&newVersion)&{&  &&&&&&&&&&&&db.execSQL(&DROP&TABLE&IF&EXISTS&&&+&TABLE_NAME);&  &&&&&&&&&&&&onCreate(db);&  &&&&&&&&}&  &&&&}&  &&&&@Override  &&&&publicint&delete(Uri&uri,&String&s,&String[]&as)&{&  &&&&&&&&return0;&  &&&&}&  &&&&@Override  &&&&public&String&getType(Uri&uri)&{&  &&&&&&&&&  &&&&}&  &&&&@Override  &&&&public&Uri&insert(Uri&uri,&ContentValues&contentvalues)&{&  &&&&&&&&sqlDB&=&dbHelper.getWritableDatabase();&  &&&&&&&&long&rowId&=&sqlDB.insert(TABLE_NAME,&&&,&contentvalues);&  &&&&&&&&if&(rowId&&&0)&{&  &&&&&&&&&&&&Uri&rowUri&=&ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(),&rowId).build();&  &&&&&&&&&&&&getContext().getContentResolver().notifyChange(rowUri,&null);&  &&&&&&&&&&&&return&rowU&  &&&&&&&&}&  &&&&&&&&thrownew&SQLException(&Failed&to&insert&row&into&&&+&uri);&  &&&&}&  &&&&@Override  &&&&publicboolean&onCreate()&{&  &&&&&&&&dbHelper&=&new&DatabaseHelper(getContext());&  &&&&&&&&return&(dbHelper&==&null)&?&false&:&&  &&&&}&  &&&&@Override  &&&&public&Cursor&query(Uri&uri,&String[]&projection,&String&selection,&String[]&selectionArgs,&String&sortOrder)&{&  &&&&&&&&SQLiteQueryBuilder&qb&=&new&SQLiteQueryBuilder();&  &&&&&&&&SQLiteDatabase&db&=&dbHelper.getReadableDatabase();&  &&&&&&&&qb.setTables(TABLE_NAME);&  &&&&&&&&Cursor&c&=&qb.query(db,&projection,&selection,&null,&null,&null,&sortOrder);&  &&&&&&&&c.setNotificationUri(getContext().getContentResolver(),&uri);&  &&&&&&&&return&c;&  &&&&}&  &&&&@Override  &&&&publicint&update(Uri&uri,&ContentValues&contentvalues,&String&s,&String[]&as)&{&  &&&&&&&&return0;&  &&&&}&  }&&&
  一个名为MyContentProvider的Content Provider创建完成了,它用于从Sqlite数据库中添加和读取记录。&
  Content
Provider的入口需要在AndroidManifest.xml中配置:
  之后,让我们来使用这个定义好的Content
  package&com.wissen.testA&  publicclass&MyContentDemo&extends&Activity&{&  &&&&@Override  &&&&protectedvoid&onCreate(Bundle&savedInstanceState)&{&  &&&&&&&&super.onCreate(savedInstanceState);&  &&&&&&&&insertRecord(&MyUser&);&  &&&&&&&&displayRecords();&  &&&&}&  &&&&privatevoid&insertRecord(String&userName)&{&  &&&&&&&&ContentValues&values&=&new&ContentValues();&  &&&&&&&&values.put(MyUsers.User.USER_NAME,&userName);&  &&&&&&&&getContentResolver().insert(MyUsers.User.CONTENT_URI,&values);&  &&&&}&  &&&&privatevoid&displayRecords()&{&  &&&&&&&&String&columns[]&=&new&String[]&{&MyUsers.User._ID,&MyUsers.User.USER_NAME&};&  &&&&&&&&Uri&myUri&=&MyUsers.User.CONTENT_URI;&  &&&&&&&&Cursor&cur&=&managedQuery(myUri,&columns,null,&null,&null&);&  &&&&&&&&if&(cur.moveToFirst())&{&  &&&&&&&&&&&&String&id&=&&  &&&&&&&&&&&&String&userName&=&&  &&&&&&&&&&&&do&{&  &&&&&&&&&&&&&&&&id&=&cur.getString(cur.getColumnIndex(MyUsers.User._ID));&  &&&&&&&&&&&&&&&&userName&=&cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME));&  &&&&&&&&&&&&&&&&Toast.makeText(this,&id&+&&&&&+&userName,&Toast.LENGTH_LONG).show();&  &&&&&&&&&&&}&while&(cur.moveToNext());&  &&&&&&&}&  &&&&}&  }&&
  上面的类将先向数据库中添加一条用户数据,然后显示数据库中所有的用户数据。&
  第五种:&网络存储数据
  前面介绍的几种存储都是将数据存储在本地设备上,除此之外,还有一种存储(获取)数据的方式,通过网络来实现数据的存储和获取。
  我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。
  具体需要熟悉java.net.*,Android.net.*这两个包的内容,在这就不赘述了,请大家参阅相关文档。
  下面是一个通过地区名称查询该地区的天气预报,以POST发送的方式发送请求到webservicex.net站点,访问WebService.webservicex.net站点上提供查询天气预报的服务。
  代码如下:
  package&com.android.&&  import&java.util.ArrayL&  import&java.util.L&  import&org.apache.http.HttpR&  import&org.apache.http.NameValueP&  import&org.apache.;&  import&org.apache.;&  import&org.apache.;&  import&org.apache.;&  import&org.apache.;&  import&org.apache.;&  import&android.app.A&  import&android.os.B&  publicclass&MyAndroidWeatherActivity&extends&Activity&{&  &&&&//定义需要获取的内容来源地址  &&&&privatestaticfinal&String&SERVER_URL&=&&  &&&&&&&&&;;&&  &&&&/**&Called&when&the&activity&is&first&created.&*/  &&&&@Override  &&&&publicvoid&onCreate(Bundle&savedInstanceState)&{&  &&&&&&&&super.onCreate(savedInstanceState);&  &&&&&&&&setContentView(R.layout.main);&  &&&&&&&&HttpPost&request&=&new&HttpPost(SERVER_URL);&//根据内容来源地址创建一个Http请求  &&&&&&&&//&添加一个变量&  &&&&&&&&List&NameValuePair&&params&=&new&ArrayList&NameValuePair&();&&  &&&&&&&&//&设置一个地区名称  &&&&&&&&params.add(new&BasicNameValuePair(&PlaceName&,&&NewYork&));&&//添加必须的参数  &&&&&&&&try&{&&  &&&&&&&&&&&&//设置参数的编码  &&&&&&&&&&&&request.setEntity(new&UrlEncodedFormEntity(params,&HTTP.UTF_8));&&  &&&&&&&&&&&&//发送请求并获取反馈  &&&&&&&&&&&&HttpResponse&httpResponse&=&new&DefaultHttpClient().execute(request);&  &&&&&&&&&&&&//&解析返回的内容  &&&&&&&&&&&&if(().getStatusCode()&!=&404){&&  &&&&&&&&&&&&&&&String&result&=&EntityUtils.toString(());&&  &&&&&&&&&&&&&&&System.out.println(result);&  &&&&&&&&&&&&}&  &&&&&&&&}&catch&(Exception&e)&{&  &&&&&&&&&&&&e.printStackTrace();&  &&&&&&&}&&  &&&&}&
  别忘记了在配置文件中设置访问网络权限:
  &uses-permission&android:name=&android.permission.INTERNET&&/&&&&
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&}

我要回帖

更多关于 浮点数如何存储 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信