《J2ME游戏开发第八章RMS(记录管理系统)编程.ppt》由会员分享,可在线阅读,更多相关《J2ME游戏开发第八章RMS(记录管理系统)编程.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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如果把一个记录库当成数据库表,那么该如果把一个记录库当成数据库表,那么该表只有两个字段:一个整数类型的
3、记录表只有两个字段:一个整数类型的记录ID和一个字节数组表示的记录数据。和一个字节数组表示的记录数据。访问记录库访问记录库不管记录是如何存储在不管记录是如何存储在MIDP设备之上的,都不设备之上的,都不允许允许MIDlet直接访问,直接访问,MIDP应用必需通过应用必需通过RMS API才能访问才能访问RMS。RMS包的体系结构学习内容学习内容打开记录集(或者说是一张表)的方法打开记录集(或者说是一张表)的方法重点讲解前两个打开记录集的方法记录文件的创建记录文件的创建之一之一和删除和删除RecordStore类是RMS的数据库开发接口记录文件的创建记录文件的创建创建一个私有的创建一个私有的Re
4、cordstore 创建和打开一个记录文件public static RecordStore open RecordStore(String recordStoreName,boolean createIfNecessary)1.recordStoreName创建和打开记录集的文件名说明:说明:说明:说明:2.createIfNecessary如果不存在该文件名是否创建记录文件的创建和删除记录文件的创建和删除public static RecordStore open RecordStore(String recordStoreName,boolean createIfNecessary)说明
5、:说明:说明:说明:3.createIfNecessary=true,而recordStoreName不存在,就创建名recordStoreName的记录文件;否则就打开它。4.createIfNecessary=false,而recordStoreName存在,就打开名recordStoreName的记录文件;否则抛出异常。记录文件的创建实例:实例:实例:实例:RecordStore rs=null;try rs=RecordStore.openRecordStore(Rs1,false);/存放地址是存放地址是C:Documents and SettingsAdministratorj2m
6、ewtk2.5.2appdb /DefaultColorPhonerun_by_class_storage_#Rs1.db catch(RecordStoreFullException e)/TODO Auto-generated catch blocke.printStackTrace();catch(RecordStoreNotFoundException e)e.printStackTrace();catch(RecordStoreException e)/TODO Auto-generated catch blocke.printStackTrace();Attention记录文件的创
7、建记录文件的创建之二之二和删除和删除public static RecordStore open RecordStore(String recordStoreName,boolean createIfNecessary,int authmode,boolean writable)说明:说明:说明:说明:后面两个参数控制他的授权模式和可写性,授权模式决定后面两个参数控制他的授权模式和可写性,授权模式决定是否其他的是否其他的MIDletsuiteMIDletsuite具有访问具有访问RecordstoreRecordstore的权限,两的权限,两种可能的模式是种可能的模式是RecordStore.
8、AUTHMODE_PRIVATERecordStore.AUTHMODE_PRIVATE(只有拥有只有拥有的的SUITESUITE才可以访问才可以访问)和和 RecordStore.AUTHMODE_ANYRecordStore.AUTHMODE_ANY(任何(任何suitesuite都可以访问),可写性控制着是否其他的都可以访问),可写性控制着是否其他的suitesuite能够能够修改修改RecordstoreRecordstore,如果,如果falsefalse的话,那么只有所属的话,那么只有所属suitesuite才才可以修改,其他的只能读取。注意所属可以修改,其他的只能读取。注意所属s
9、uitesuite可以在任何时可以在任何时候调用候调用 RecordStore.setModeRecordStore.setMode()()来修改它的授权和读写模来修改它的授权和读写模式。式。创建一个可共享的Recordstore记录文件的关闭和删除实例:实例:实例:实例:public void closeRecordStore()throws RecordStoreNotFoundException,RecordStoreExceptioncloseRecordStore()和openRecordStore()调用次数同才能实现真正关闭。public void deleteRecordSto
10、re(String recordStoreName)throws RecordStoreException/删除前必须关删除前必须关删除前必须关删除前必须关闭闭闭闭 RecordStoreNotFoundExceptionRecordStore常用方法针对记录集的操作针对记录集的操作占据空间大小 size()得到记录集的名称 getName()列出当前的所有记录集 RecordStore.listRecordStores()添加记录的操作添加记录的操作每个记录都有ID,第一个记录的ID为1记录的添加记录的添加public int addRecord(byte data,int offset,i
11、nt numBytes)说明:说明:说明:说明:data存储offset指定从数组data的那个元素开始存储!数据必须是!数据必须是byte类型类型,其它类型必须其它类型必须转换成该类型转换成该类型numBytes指明需要存储字节的个数添加记录到RMS实例:实例:实例:实例:byte data=new byte0,1,2;try rs.addRecord(data,0,3);catch(RecordStoreException e)system.out.println(e);e.printStackTrace();添加两个记录“张三”,“王小六”到RMS实例:实例:实例:实例:记录的读取记录的
12、读取getRecord(int recordId,byte buffer,int offset)/性能效率高性能效率高性能效率高性能效率高说明:说明:说明:说明:通过指定一个记录的主键recordId获取数据开始序号offset读取数据存储到传入的变量buffer中getRecord(int recordId)/使用方便使用方便使用方便使用方便记录的更新记录的更新(修改修改)public setRecord(int RecordId,byte newData,int offset,int numBytes)说明:说明:说明:说明:recordId指定需要修改记录的主键offset获取数据开始序
13、号返回一个numBytes大小的字节数组的记录newData保存数据内容getRecordDemosetRecordDemo记录的删除记录的删除public setRecord(int RecordId)说明:说明:说明:说明:recordId指定需要删除记录的主键删除一条记录后,虽然记录数目减少了,但是记录还是保持在原来的位置,以后添加,ID在后面添加。将对象写入将对象写入RMS案例:要求定义一个对象Customer,包括姓名,电话号码和年龄,要求存入RMS步骤:1)将对象转换为字节数组(序列化)/将对象转为字节数组的方法public byte object2ByteArray()throw
14、s Exception ByteArrayOutputStream baos=new ByteArrayOutputStream();DataOutputStream dos=new DataOutputStream(baos);/利用dos将对象写入baosdos.writeUTF(ame);dos.writeUTF(this.phone);dos.writeInt(this.age);baos.close();dos.close();return baos.toByteArray();2 2)将字节数组转换为对象)将字节数组转换为对象public static Customer byteA
15、rray2Object(byte bf)throws ExceptionByteArrayInputStream 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.close();doa.close();return co;rs=RecordStore.openRecordStore(
16、rs1,true);Customer ct=new Customer();ct.setCname(张三丰);ct.setPhone(15030693561);ct.setAge(18);try/写入记录 byte bt=ct.object2ByteArray();rs.addRecord(bt,0,bt.length);/读取记录 byte bt1=ct.object2ByteArray();Customer ct1=null;ct1=Customer.byteArray2Object(bt1);System.out.println(ct.getCname();System.out.print
17、ln(ct.getPhone();System.out.println(ct.getAge();catch(Exception e)e.printStackTrace();记录的遍历记录的遍历之方法一之方法一getNextRecordId()说明:说明:说明:说明:获得目前最后一个主键数值获得目前最后一个主键数值,然后把这个然后把这个数值数值+1+1相当于获得如果再添加一个记录时所产生相当于获得如果再添加一个记录时所产生的新记录的主键数值的新记录的主键数值此遍历方法效率低下此遍历方法效率低下,记录多次被删除添记录多次被删除添加加,主键的顺序未必是主键的顺序未必是+1+1递增的递增的记录的遍历记
18、录的遍历之方法二之方法二public 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 S
19、ystem.out.println(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();*/记录监听的作用:记录监听的作用:如果数据被修改如果数据被修改,相关数据能够被更新。相
20、关数据能够被更新。记录监听的实现1)定义一个类,实现接口RecordListener2)定义(重写)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 RecordLi
21、stener RecordStore rs=RecordStore.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 S
22、ystem.out.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,RecordComparator comp
23、arator,boolean keepUpdated)说明:说明:说明:说明:RecordFilter是遍历过程中实现过滤过滤的接口RecordFilter需要实现的方法:public boolean matches(byte candidate)candidate为需要过滤的二进制数据数据过滤的使用数据过滤的使用1)定义一个类,实现RecordFilter接口2)定义(重写)match()方法,返回true或false3)用枚举的方法进行遍历,将该对象传进去查找姓狄的资料查找姓狄的资料实例:实例:实例:实例:public class MyFilter extends MIDlet imple
24、ments RecordFilter public boolean matches(byte arg0)/TODO Auto-generated method stubString 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.hasN
25、extElement()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 为需要比较
26、的两个字节数组RecordComparator是遍历过程中实现记录比较比较的接口RecordComparator的使用定义一个类,实现RecordComparator接口定义(重写)Comparator(byte rec1,byte rec2)方法,根据情况返回:RecordComparator.PRECEDES【rec1在在rec2之前之前】RecordComparator.FOLLOWS【rec1在在rec2之后之后】RecordComparator.EQUIVALENT【rec1=rec2】用枚举的方法进行遍历,将该对象传进去查询大于100的资料并按升序排列实例:实例:实例:实例:pub
27、lic class MyComparator implements RecordFilter,RecordComparator public int compare(byte rec1,byte rec2)String str1=new String(rec1);String str2=new String(rec2)int result=pareTo(str2);if(result=0)return RecordComparator.EQUIVALENT;else if(result0)return RecordComparator.PRECEDES;else return RecordComparator.FOLLOWS;查询大于100的资料并按升序排列实例:实例:实例:实例:RecordStore rs=RecordStore.openRecordStore(rs1,true);RecordEnumeration re=null;try re=rs.enumerRecords(this,this,false);if(re.hasNextElement()System.out.println(newString(re.nextRecord();catch(Exception e)案例设计案例设计