第06章数据存储.ppt_第1页
第06章数据存储.ppt_第2页
第06章数据存储.ppt_第3页
第06章数据存储.ppt_第4页
第06章数据存储.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章,数据存储,目标,理解RMS的体系结构 熟悉记录存储的管理方法 掌握记录的增、删、改等基本操作,记录管理系统,记录管理系统概述,几乎所有的游戏都需要在运行过程中保存信息,类似:玩家输入的数据,例如玩家的姓名;游戏的进程数据,例如关数、分数等;经常需要使用的工具,例如常用的URL链接等。 在MIDP规范中,提供了记录管理系统(Record Management System, RMS),这个记录管理系统就是一个小型简单的数据库管理系统(Database Management System),除了能用于管理系统储存资料之外,也可以用于存储对象的状态信息。,记录仓库的根本作用就是提供给开发人员

2、以存储信息、提取信息的功能。 MIDP规范要求所有的实现提供持久存储机制,以保证当设备关闭的时候,相关的信息能够进行保存。实际上,这种存储机制在不同的设备上并不一致,但是对于MIDlet来讲,其应用接口是一致的,这使得MIDlet不需要考虑在设备之间的差异性。,记录管理系统是一个小型的数据库,存在很多记录仓库(Record Store)。在记录仓库中的存在一条一条的资料,也称为记录。它们之间的关系:,记录管理系统,记录管理系统概述,所有和记录管理系统相关的类别都属于javax.microedition.rms,其中共包含以下类: 1. 一个类:RecordStore 2. 四个接口:Recor

3、dComparator,RecordFilter,RecordListener, RecordEnumeration 3. 五种异常:InvalidRecordException,RecordStoreException,RecordStoreFullException,RecordStoreNotFoundException,RecordStoreNotOpenException,记录管理系统,记录管理系统概述,记录仓库管理,记录仓库(Record Store)是记录的集合,在每一个MIDlet Suite 之中,每一个资料仓库都有它独一无二的名字,长度不能超过32个Unicode 字符,并

4、且区分大小写。 同一个MIDlet Suite之中的MIDlet 都可以共享这些RecordStore,而不同MIDlet Suite 之间无法共享记录仓库。 MIDlet不能够访问诸如地址簿之类的数据,非Java的程序也不能够访问MIDlet的数据。,记录管理系统,打开记录仓库 使用RecordStore 类的openRecordStore()方法: openRecordStore(String name, boolean create) 第一个参数是RecordStore的名称,第二个参数如果传入的是true,代表如果我们所要开启的资料仓库不存在,请系统帮我们建立一个新的RecordSto

5、re;反之,如果传入的是false, 代表如果我们所要开启的RecordStore不存在, 就抛出RecordStoreNotFoundException 异常。 openRecordStore(StringrecordStoreName, booleancreateIfNecessary, intauthmode, booleanwritable) 前两个参数同上,第三个参数是创建方式(PRIVATE /ANY)是否可以被其他套件访问。第四个参数,其他套件是否可以进行写操作 。,记录管理系统,记录仓库管理,关闭记录仓库 当MIDlet不再使用RecordStore的时候,应当使用closeR

6、ecordStore()函数关闭RecordStore。如果有多个MIDlet打开了同一个RecordStore,这个RecordStore直到所有的MIDlet执行了关闭操作才会被真正关闭。,/ 两次打开同一个RecordStore RecordStore scores = RecordStore.openRecordStore(Scores, true); RecordStore scores2 = RecordStore.openRecordStore(Scores, true); / 关闭RecordStore,第一次并不会真正关闭 scores.closeRecordStore( )

7、; / 真正关闭RecordStore scores2.closeRecordStore( );,记录管理系统,记录仓库管理,删除记录仓库 可以使用静态函数deleteRecordStore( )删除RecordStore对象: public static void deleteRecordStore(String name) 如果该RecordStore还在被某个MIDlet使用,那么删除的操作会引起RecordStoreException异常。如果该名字的RecordStore并不存在,该操作会引起RecordStoreNotFoundException异常。 只有被关闭的RecordSt

8、ore对象才能够被删除,假如对应的MIDlet Suite进行了卸载,那么对应的RecordStore会自动被删除。,记录管理系统,记录仓库管理,列出记录仓库 MIDlet可以使用listRecordStores函数获得该MIDlet Suite所拥有的所以RecordStore的名称 public static String listRecordStores( ) 如果MIDlet Suite没有RecordStore存在,则返回一个空的数组。 思考:写一个方法,来判断一个指定名字的RecordStore是否存在,记录管理系统,记录仓库管理,使用记录仓库的方法 已经打开的RecordStor

9、e的相关方法: public String getName( )返回RecordStore的名字 getLastModified( )返回上次修改的时间。从1970.1.1零时至此的微秒值。与System currentTimeMillis( )返回值相同。 public int getVersion( )返回一个整数值,表示该数据被操作的次数,例如增加,删除,修改等操作都会被记录 public int getSize( )返回RecordStore占用的字节数目 public int getSizeAvailable( )返回该RecordStore允许增长的最大占用空间,该空间包括管理数据

10、自身需要的空间。,记录管理系统,记录仓库管理,记录的基本操作,ID RecordStore包含多个record,每一个record都有一个独一无二的ID值。该ID值不属于record自身,而是在record创建时候进行分配。分配ID的有以下的原则: 分配给第一个record的ID是1,新记录分配的ID值比原有记录ID值大,记录管理系统,添加记录( addRecord) int addRecord(byte data,int offset,int numBytes) 将bytes 数组存放到RecordStore之中,并传回其Record ID。 记录的数据从data字节流中获得,第一个字节是d

11、ataoffset,最后一个字节是dataoffset +size - 1,可以使用DataOutputStream 以及ByteArrayOutputStream共同将对象值转变称为正确的字节流。,以下是一个表示游戏中用户分数的对象,现在需要将该对象作为一个record进行保存。 对象定义如下: public class ScoreRecord public String playerName; /名称 public int score; / 分数 ,记录管理系统,记录的基本操作,以下是转换的过程:,/ 创建对象 ScoreRecord record = new ScoreRecord( )

12、; record.playerName = TopNotch; record.score = 12345678; / 创建输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream( ); DataOutputStream os = new DataOutputStream(baos); / 将对象值保存到输出流中 os.writeUTF(record.playerName); os.writeInt(record.score); os.close( );,记录管理系统,记录的基本操作,增加记录 / 获得字节流 byte data =

13、baos.toByteArray( ); / 将记录写到record store中 int id = recordStore.addRecord(data, 0, data.length);,记录管理系统,记录的基本操作,获取记录(getRecord) byte getRecord(int recordid) 取出特定Record ID 的那笔数据。同样这也是针对byte数组的操作,因此也需要利用DataInputStream 以及ByteArrayInputStream 简化从Java类型到字节集合的转换工作。 int getRecord(int recordid,byte data,int

14、 offset) 表示将取出的值置于dataoffset开始的位置。,记录的基本操作,记录管理系统,byte data = recordStore.getRecord(recordId); DataInputStream is = new DataInputStream(new ByteArrayInputStream(data); ScoreRecord record = new ScoreRecord( ); record.playerName = is.readUTF( ); record.score = is.readInt( ); is.close( );,getRecord byt

15、e getRecord(int recordid) 取出特定Record ID 的那笔数据。同样这也是针对byte数组的操作,因此也需要利用DataInputStream 以及ByteArrayInputStream 简化从Java类型到字节集合的转换工作。,记录管理系统,记录的基本操作,修改记录(setRecord) public void setRecord(int recordId, byte data, int offset, int size); 利用该函数可以修改记录值。修改记录的过程其实相当于读写两个步骤的结合 。,记录管理系统,/ 修改记录 record.score += 10; ByteArrayOutputStream baos = new ByteArrayOutputStream( ); DataOutputStream os = new DataOutputStream(baos); os.writeUTF(record.playerName); os.writeInt(record.score); os.close( ); byte data = baos.toByt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论