J2ME游戏开发第八章RMS(记录管理系统)编程.ppt_第1页
J2ME游戏开发第八章RMS(记录管理系统)编程.ppt_第2页
J2ME游戏开发第八章RMS(记录管理系统)编程.ppt_第3页
J2ME游戏开发第八章RMS(记录管理系统)编程.ppt_第4页
J2ME游戏开发第八章RMS(记录管理系统)编程.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、J2ME游戏开发,第八章 RMS(记录管理系统)编程,主要内容,掌握数据持久存储的基本概念,掌握记录文件的关闭,掌握记录的添加、删除和更新,掌握记录的过滤与比较,掌握记录的遍历读取,掌握数据持久性存储的综合应用,前言,数据持久性存储就是必须以某种方式保存,不能丢失,并且能够有效地、简便地检索和更新。,RMS概述,RMS(记录管理系统):是MIDP 标准数据持久性开发系统,它负责数据在手机上的存储、检索、更新。 小型、简单数据库管理系统 可以保存简单数据 可以将对象状态经过序列化之后,保存到记录管理系统 记录管理系统存在于设备特定的存储空间,称为RMS空间,持久化存储的必要性,如果有游戏要存盘,

2、怎么办呢?-RMS 存入文件?但是有的手机不支持?-RMS 于是在J2ME中出现了RMS,它和数据库相类似。 相关的包:javax.microedition.rms 怎么做才能保存数据呢?-RecordStore RMS相当于一个管理系统; RecordStore是记录集,类似于表,表中有记录Record,数据持久性存储开发简介,RMS的操作是通过RecordStore类完成,import javax.microedition.rms.RecordStore 如果把一个记录库当成数据库表,那么该表只有两个字段:一个整数类型的记录ID和一个字节数组表示的记录数据。,访问记录库,不管记录是如何存储

3、在MIDP设备之上的,都不允许MIDlet直接访问,MIDP应用必需通过RMS API才能访问RMS。,RMS包的体系结构,学习内容,打开记录集(或者说是一张表)的方法,重点讲解前两个打开记录集的方法,记录文件的创建之一和删除,RecordStore类是RMS的数据库开发接口,记录文件的创建 创建一个私有的Recordstore,创建和打开一个记录文件,public static RecordStore open RecordStore(String recordStoreName,boolean createIfNecessary),1.recordStoreName创建和打开记录集的文件名

4、,说明:,2.createIfNecessary如果不存在该文件名是否创建,记录文件的创建和删除,public static RecordStore open RecordStore(String recordStoreName,boolean createIfNecessary),说明:,3.createIfNecessary=true,而recordStoreName不存在,就创建名recordStoreName的记录文件;否则就打开它。,4.createIfNecessary=false,而recordStoreName存在,就打开名recordStoreName的记录文件;否则抛出异常

5、。,记录文件的创建,实例:,RecordStore rs=null;,try rs=RecordStore.openRecordStore(Rs1,false); / 存放地址是C:Documents and SettingsAdministratorj2mewtk2.5.2appdb / DefaultColorPhonerun_by_class_storage_#Rs1.db catch (RecordStoreFullException e) / TODO Auto-generated catch block e.printStackTrace(); catch (RecordStore

6、NotFoundException e) e.printStackTrace(); catch (RecordStoreException e) / TODO Auto-generated catch block e.printStackTrace(); ,Attention,记录文件的创建之二和删除,public static RecordStore open RecordStore(String recordStoreName,boolean createIfNecessary,int authmode,boolean writable),说明:,后面两个参数控制他的授权模式和可写性,授权

7、模式决定是否其他的MIDletsuite具有访问Recordstore的权限,两种可能的模式是RecordStore.AUTHMODE_PRIVATE(只有拥有的SUITE才可以访问)和 RecordStore.AUTHMODE_ANY(任何suite都可以访问),可写性控制着是否其他的suite能够修改Recordstore,如果false的话,那么只有所属suite才可以修改,其他的只能读取。注意所属suite可以在任何时候调用 RecordStore.setMode()来修改它的授权和读写模式。,创建一个可共享的Recordstore,记录文件的关闭和删除,实例:,public void

8、 closeRecordStore() throws RecordStoreNotFoundException, RecordStoreException,closeRecordStore()和openRecordStore()调用次数同才能实现真正关闭。,public void deleteRecordStore(String recordStoreName) throws RecordStoreException /删除前必须关闭 RecordStoreNotFoundException,RecordStore常用方法,针对记录集的操作 占据空间大小 size() 得到记录集的名称 get

9、Name() 列出当前的所有记录集 RecordStore.listRecordStores() 添加记录的操作 每个记录都有ID,第一个记录的ID为1,记录的添加,public int addRecord(byte data,int offset,int numBytes),说明:,data存储,offset指定从数组data的那个元素开始存储,!数据必须是byte类型,其它类型必须转换成该类型,numBytes指明需要存储字节的个数,添加记录到RMS,实例:,byte data=new byte0,1,2; try rs.addRecord(data,0,3); catch ( Recor

10、dStoreException e) system.out.println(e); e.printStackTrace();,添加两个记录 “张三”,“王小六”到RMS,实例:,记录的读取,getRecord(int recordId,byte buffer,int offset) /性能效率高,说明:,通过指定一个记录的主键recordId,获取数据开始序号offset,读取数据存储到传入的变量buffer中,getRecord(int recordId) /使用方便,记录的更新(修改),public setRecord(int RecordId,byte newData,int offse

11、t,int numBytes),说明:,recordId指定需要修改记录的主键,offset获取数据开始序号,返回一个numBytes大小的字节数组的记录,newData保存数据内容,getRecordDemo,setRecordDemo,记录的删除,public setRecord(int RecordId),说明:,recordId指定需要删除记录的主键,删除一条记录后,虽然记录数目减少了,但是记录还是保持在原来的位置,以后添加,ID在后面添加。,将对象写入RMS,案例:要求定义一个对象Customer,包括姓名,电话号码和年龄,要求存入RMS 步骤: 1)将对象转换为字节数组(序列化)

12、/将对象转为字节数组的方法 public byte object2ByteArray () throws Exception ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos=new DataOutputStream(baos); /利用dos将对象写入baos dos.writeUTF(ame); dos.writeUTF(this.phone); dos.writeInt(this.age); baos.close(); dos.close(); return baos.toByte

13、Array(); ,2)将字节数组转换为对象 public static Customer byteArray2Object (byte bf) throws Exception ByteArrayInputStream ba = new ByteArrayInputStream(bf); DataInputStream doa=new DataInputStream(ba); Customer co=new Customer(); co.setCname(doa.readUTF(); co.setPhone(doa.readUTF(); co.setAge(doa.readInt(); ba

14、.close(); doa.close(); return co; ,rs =RecordStore.openRecordStore(rs1,true); Customer ct=new Customer(); ct.setCname(张三丰); ct.setPhone; ct.setAge(18); try /写入记录 byte bt=ct.object2ByteArray(); rs.addRecord(bt,0,bt.length); /读取记录 byte bt1=ct.object2ByteArray(); Customer ct1=null; ct1=Cus

15、tomer.byteArray2Object(bt1); System.out.println(ct.getCname(); System.out.println(ct.getPhone(); System.out.println(ct.getAge(); catch (Exception e) e.printStackTrace(); ,记录的遍历之方法一,getNextRecordId(),说明:,获得目前最后一个主键数值,然后把这个数值+1,相当于获得如果再添加一个记录时所产生的新记录的主键数值,此遍历方法效率低下,记录多次被删除添加,主键的顺序未必是+1递增的,记录的遍历之方法二,pu

16、blic RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator,boolean keepUpdated),说明:,RecordFilter是遍历过程中实现过滤的接口,RecordComparator是遍历过程中实现记录比较的接口,如不要求比较和过滤,可设置为null,/容易出错的遍历,仍然遍历最大的ID次 rs.deleteRecord(3); int n=rs.getNextRecordID(); for(int j=1;jn;j+) try System.out.println

17、(new String(rs.getRecord(j); catch(Exception ex) System.out.println(ex.getMessage(); /* 枚举法遍历,能够自动判断并发现被删除的记录,性能较好 * RecordEnumeration re =rs.enumerateRecords(null,null,true); while(re.hasNextElement() System.out.println(new String(re.nextRecord(); */,记录监听的作用: 如果数据被修改,相关数据能够被更新。,记录监听的实现,1)定义一个类,实现接口

18、RecordListener 2)定义(重写) recordAdded(RecordStore rs, int id) 、recordChanged(RecordStore rs, int id) 和recordDeleted(RecordStore rs, int id) 3)绑定监听器RecordStore.addRecordListener(RecordListener listener),监听器类的实现,实例:,public class SimpleListener extends MIDlet implements RecordListener RecordStore rs= Rec

19、ordStore . openRecordStore(rs1,true); rs. addRecordListener (this); rs.addRecord(中国.getBytes(),0,4); public void recordAdded(RecordStore rs, int id) try System.out.println(rs.getName() + 增加记录: + id); catch (RecordStoreNotOpenException e) public void recordChanged(RecordStore rs, int id) try System.o

20、ut.println(rs.getName() + 修改纪录: + id); catch (RecordStoreNotOpenException e) public void recordDeleted(RecordStore rs, int id) try System.out.println(rs.getName() + 删除记录: + id); catch (RecordStoreNotOpenException e) ,记录的过滤,public RecordEnumeration enumerateRecords(RecordFilter filter,RecordComparato

21、r comparator,boolean keepUpdated),说明:,RecordFilter是遍历过程中实现过滤的接口,RecordFilter需要实现的方法: public boolean matches(byte candidate),candidate为需要过滤的二进制数据,数据过滤的使用,1)定义一个类,实现RecordFilter接口 2)定义(重写)match()方法,返回true或false 3)用枚举的方法进行遍历,将该对象传进去,查找姓狄的资料,实例:,public class MyFilter extends MIDlet implements RecordFilt

22、er public boolean matches(byte arg0) / TODO Auto-generated method stub String str=new String(arg0); if(str.startsWith(“狄) return true; return false; ,实例:,RecordStore rs= RecordStore . openRecordStore(rs1,true); RecordEnumeration re=null; try re=rs.enumerRecords(this,null,false); if(re.hasNextElement

23、() System.out.println(newString(re.nextRecord(); catch(Exception e) ,查找姓狄的资料,记录的排序,public RecordEnumeration enumerateRecords(RecordFilter filter,RecordComparator comparator,boolean keepUpdated),说明:,RecordComparator 需要实现的方法: public int compare(byte rec1, byte rec2),rec1和rec2 为需要比较的两个字节数组,RecordComparator是遍历过程中实现记录比较的接口,RecordComparator的使用,定义一个类,实现RecordComparator接口 定义(重写)Com

温馨提示

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

评论

0/150

提交评论