【教学课件】第5章记录存储系统.ppt

上传人:小飞机 文档编号:5659059 上传时间:2023-08-06 格式:PPT 页数:56 大小:386.97KB
返回 下载 相关 举报
【教学课件】第5章记录存储系统.ppt_第1页
第1页 / 共56页
【教学课件】第5章记录存储系统.ppt_第2页
第2页 / 共56页
【教学课件】第5章记录存储系统.ppt_第3页
第3页 / 共56页
【教学课件】第5章记录存储系统.ppt_第4页
第4页 / 共56页
【教学课件】第5章记录存储系统.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《【教学课件】第5章记录存储系统.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第5章记录存储系统.ppt(56页珍藏版)》请在三一办公上搜索。

1、第5章记录存储系统,主讲教师:贾震斌,本章教学目标,理解记录存储系统的作用和功能;掌握记录存储系统创建、打开、关闭操作方法;掌握在记录存储系统中增加、获取、删除和修改记录的操作方法;掌握记录存储系统的记录枚举接口、记录过滤接口、记录比较接口、记录监听接口的功能和常用方法掌握“备忘录实例”编程、调试及运行。,本章学习建议,从理解引进记录存储系统的原因,掌握记录存储系统功能和方法;学习中注意比较与掌握记录存储系统中与之对应的概念,比如数据库中存在着数据库、数据表、记录、字段的概念,与记录存储系统中相应概念的区别联系;本章的难点是理解记录存储系统中记录枚举接口、记录过滤接口、记录比较接口、记录监听接

2、口的功能和常用方法的使用。随着学习内容的深入,应该更加重视综合实例的分析、编程、调试和运行,以便更好地理解学习内容。,本章目录,5.1 记录存储系统概述5.2 记录存储系统基本操作5.3 记录存储系统高级操作5.4 备忘录实例习题,5.1 记录存储系统概述,为了增加程序的灵活性,有必要将程序中数据和程序分开,从而实现改变数据不必修改程序的要求,进而实现对数据的管理(包括数据的增加、修改、插入、删除、查找等处理)功能,将就产生了对数据库的需要,本章介绍的记录存储系统,本质上是J2ME的“数据库”。对于J2ME的MIDP设备来说,所谓记录存储系统是一种存储机制,以便退出系统后仍然可以让数据永久保存

3、;每个记录存储都有一个名字,在MIDlet中是通过记录存储名来访问存储数据,因此在同一个MIDlet中记录存储名不能重复,当删除一个MIDlet时,与其相关的记录存储也会删除;记录存储机制是由类实现的。,5.2 记录存储系统基本操作,5.2.1 创建、打开记录存储5.2.2 增加记录5.2.3 获取记录5.2.4 删除记录5.2.5 修改记录,5.2.1 创建、打开记录存储,创建和打开记录存储采用相同的静态方法:public satic RecordStore openRecordStore(String name,boolean nece)public satic RecordStore o

4、penRecordStore(String name,boolean nece,int mode,boolean writable)public satic RecordStore openRecordStore(String name,String vendor,String suiteName)参数说明:String name:记录存储系统名字boolean nece:值为true时当记录存储系统不存在时创建它,否则不创建,报告异常int mode:记录存储系统权限,其值为AUTHMODE_PRIVATE时表示私有,即只有创建该记录存储系统的MIDlet Suite程序才可以访问它;其值为

5、AUTHMODE_ANY时表示允许其他MIDlet Suite程序访问它。如果不明确设置mode,默认为AUTHMODE_PRIVATEboolean writable:只有在创建记录存储系统时有效,表示是否赋予其他MIDlet Suite程序可写访问权限String vendor:表示拥有该记录存储系统的MIDlet Suite程序发布者String suiteName:MIDlet Suite程序名字,创建一个记录存储系统的语句,RecordStore rs=RecordStore.openRecordStore(“telSys”,true);创建了一个名为“telSys”的记录存储系统,

6、如果该系统不存在则创建个新的记录存储系统,关闭记录存储系统的方法,Void closeRecordStore()如果记录存储系统中有多个记录存储被打开,只有当所有记录都被关闭后,才会最终关闭整个记录存储系统,删除记录存储系统的方法,static void deleteRecordStore(String recordname)String recordname:记录存储系统名注意:删除记录存储系统和后面将介绍删除存储记录这两个概念的区别。,获得记录存储系统中记录总数的方法,int getNumRecords()注意:这个方法属于RecordStore 对象,取得的是整个记录存储系统记录总数,与

7、后面RecordEnumeration对象的获取记录数方法不同:(1)两个方法所属对象不同;(2)RecordStore 对象中的方法统计的是整个记录存储系统中的记录数,RecordEnumeration对象中的方法统计是本对象中的记录数,通常小于或等于整个记录存储系统中的记录数。,5.2.2 增加记录,记录存储系统和存储记录是两个不同概念,但两者又是紧密联系的。记录存储系统包含着一条条存储记录,两者的关系如同数据库与数据记录的关系。每条存储记录都是有一个唯一的ID号,首条记录ID号默认值是1,其后添加的记录ID 号随着记录数的增加而自动增长。即使其中一条记录被删除了,也不会影响其增加的下一条

8、记录的ID号。,增加记录的方法,public int addRecord(byte data,int offset,int numBytes)byte data:添加的记录内容 int offset:添加记录在数组里的起始下标int numBytes:添加记录的字节数添加成功后返回的记录ID号注意:从这个方法的第1个参数可以看出添加的记录类型必须是byte,但在实际应用中需要添加的记录类型是多种多样,如字符、字符串、整数、浮点数、逻辑数等,这就要求在使用添加记录方法addRecord()前首先将其他数据类型转换为byte型数据,然后才能使用这个方法。,将数据转换为字节型的类,DataOutpu

9、tStream、ByteArrayOutputStream这两个类配合可以完成将数据转换为字节型数据的工作,方法如下:/首先创建一个ByteArrayOutputStream 对象,这个对象可以将得到的数据转换化字节数组型数据输出ByteArrayOutputStream bs=new ByteArrayOutputStream();/将ByteArrayOutputStream 对象作为参数,创建与这个对象关联的DataOutputStream 对象,DataOutputStream 对象提供了将各种基本JAVA数据类型转换为数据输出流的方法DataOutputStream ds=new D

10、ataOutputStream(bs);/调用DataOutputStream 对象的方法writeInt()将int型 数据转换为数据输出流,以便传递给ByteArrayOutputStream 对象;ds.writeInt();ds.close();/将ByteArrayOutputStream 对象中的字节数组数据取出存入字节数组 b中byte b=bs.toByteArray();注:关于DataOutputStream、ByteArrayOutputStream这两个类的说明可以参考WTK Documentation。,5.2.3 获取记录,获取记录存储系统中记录的方法:byte g

11、etRecord(int recordID)int recordID:记录号注意:记录存储系统中存储的数据只能是字节数组类型byte,但在实际应用中需要的记录类型同样是多种多样,这就要求将从记录存储系统取得的数据转换成实际需要的数据类型,如字符、字符串、整数、浮点数、逻辑数等,DataOutputStream、ByteArrayInputStream这两个类配合可以完成这个工作,关于这两个类的说明可以参考WTK Documentation。,例程,/从记录存储系统中取得字节数组型数据存入b中byte b=rs.getRecord(id);/创建与b关联的ByteArrayInputStream

12、 型对象baisByteArrayInputStream bais=new ByteArrayInputStream(b);/建立与bais关联的DataInputStream 对象disDataInputStream dis=new DataInputStream(bais);/调用DataInputStream 对象的 readUTF()将得到的数据转换成UTF格式字符串;dis.readUTF();/dis.readInt();将得到的数据转换成int型数据dis.close();,UTF-8,补充内容:UTF(Universal Transformation Format)是UNICO

13、DE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。,5.2.4 删除记录,删除记录的方法:void deleteRecord(int recordID)int recordID:记录号,5.2.5 修改记录,修改记录的方法:setRecord(intrecordId,byte data,intoffset,intnumBytes)intrecor

14、dId:被替换数据的记录号byte data:用来替换记录的数据数组intoffset:将要替换记录数据在数组中的位置intnumBytes:要替换的数据的字节数,修改记录例程,ByteArrayOutputStream baos=new ByteArrayOutputStream();DataOutputStream dos=new DataOutputStream(baos);dos.writeString(string);dos.close();byte b=baos.toByteArray();rs.setRecord(id,b,0,b.length);,5.3 记录存储系统高级操作,

15、5.3.1 记录枚举接口5.3.2 记录过滤接口5.3.3 记录比较接口5.3.4 记录监听接口,5.3.1 记录枚举接口,记录枚举接口对象(RecordEnumeration)可以从记录存储系统中取得符合条件的多个记录,并在这些记录中前后浏览,以便对某条记录操作。RecordStore 的enumerateRecords 方法可以创建RecordEnumeration 对象。RecordEnumeration enumerateRecords(RecordFilter filter,RecordComparator comparator,Boolean updat)filter(过滤器)参数

16、:设置需要查找记录的过滤条件comparator(比较器)参数:设置记录排序updat参数:可以设置当记录存储内容发生变化时 RecordEnumeration 对象取得的记录是否随着变化这个对象的功能比用RecordStore对象的getRecord()方法获取记录功能更为强大,RecordEnumeration 对象的方法,void rebuild():重新创建对象以便更新数据int nextRecordId():获得下一条记录号byte nextRecord():获得下一条记录数据int previousRecordId():获得前一条记录号byte previousRecord():获

17、得前一天记录数据void reset():将对象索引恢复到刚创建时状态boolean hasNextElement():判断是否还有下一条记录boolean hasPreviousElement():判断是否还有前一条记录int numRecords():返回对象中记录总数(注意与RecordStore获取记录总数方法的区别),RecordEnumeration 对象读取数据方法,RecordEnumeration re=rs.enumerateRecords();while(true)if(re.hasNextElement()=false)break;int id=re.getRecord

18、ID();byte b=rs.getRecord(id);,5.3.2 记录过滤接口,RecordStore 对象的enumerateRecords 方法中的过滤器参数类型本身也是一种接口对象,即记录过滤接口对象RecordFilter,这个接口可以用来过滤出符合条件的数据记录,接口提供了抽象方法用来实现过滤方法:public boolean matches(bytecandidate)matches()方法的参数,记录过滤接口实现方法,下面程序中matches()方法的参数为记录存储系统中某条记录的数据,希望与该数据相匹配的记录被选中时,就让matches()方法返回true,否则返回fal

19、se。class MyFilter implements RecordFilterpublic boolean matches(bytecandidate)ByteArrayInputStream bais=new ByteArrayInputStream(b);DataInputStream dis=new DataInputStream(bais);dis.readUTF();return true;,5.3.3 记录比较接口,与记录过滤接口类似,前面介绍的RecordStore 对象的enumerateRecords 方法中的比较器参数的类型本身也是一种接口对象,即记录比较接口对象Rec

20、ordComparator,可以用来对数据记录排序进行比较,这个对象提供了抽象方法用来实现记录比较接口方法:int compare(byte data1,byte data2)byte data1,byte data2:两条记录该方法返回值有3种:RecordComparator.EQUIVALENT:表示两条记录没有顺序RecordComparator.FOLLOWS:表示data1在data2之后RecordComparator.PRECEDES:表示data1在data2之前,记录比较接口实现方法,class MyFilter implements RecordComparatorpub

21、lic int compare(byte d1,byte d2)ByteArrayInputStream bs1=new ByteArrayInputStream(d1);DataInputStream ds1=new DataInputStream(bs1);String s1=ds1.readUTF();ByteArrayInputStream bs2=new ByteArrayInputStream(d2);DataInputStream ds2=new DataInputStream(bs2);String s2=ds2.readUTF();if(pareTo(s2)=0)return

22、 RecordComparator.EQUIVALENT;if(pareTo(s2)0)return RecordComparator.FOLLOWS;if(pareTo(s2)0)return RecordComparator.PRECEDES;,5.3.4 记录监听接口,MIDP提供了对记录数据的变化进行监听的接口RecordListener,用于监听记录数据增加、删除和改变事件的发生,与此对应的事件处理过程抽象方法是:void recordAdded(RecordStore recordStore,int recordId):Called when a record has been a

23、dded to a record store.void recordChanged(RecordStore recordStore,int recordId)Called after a record in a record store has been changed.void recordDeleted(RecordStorer ecordStore,int recordId)Called after a record has been deleted from a record store.,记录监听注册方法,调用RecordStore对象的方法进行监听注册:void addRecord

24、Listener(RecordListener listener),5.4 备忘录实例,本例程是一个综合性较强的程序,包含了前面各章及本章编程方法,务必认真阅读后上机实现。,程序结构分析,Memoire:主类,完成创建List类型主界面、为主界面设置菜单命令、监听器及菜单处理方法,创建自定义类的对象。Add:自定义类,完成添加信息功能,这是一个继承于Form的Displayable型屏幕类,以便可以在它里面添加输入时间和内容信息的文本域。MyComparator:自定义类,完成在显示信息时按照信息时间降序排序。Data:自定义类,实现对记录存储系统的操作,包含保存、删除、查看信息的方法。,Me

25、moire类,定义数据成员Memoire()构造方法dialog()方法show()方法菜单命令处理方法,定义数据成员,private String s=添加备忘信息,察看备忘信息;private List list,listlook;private Add add;private Data data;,Memoire()构造方法,public Memoire()list=new List(备忘录,List.IMPLICIT,s,null);data=new Data();add=new Add(this,data);list.addCommand(new Command(exit,Comma

26、nd.EXIT,1);list.addCommand(new Command(进入,Command.OK,1);list.setCommandListener(this);,dialog()方法,public void dialog()Alert alert=new Alert(,添加成功,null,null);alert.setTimeout(1000);(Display.getDisplay(this).setCurrent(alert);,show()方法,public void show()(Display.getDisplay(this).setCurrent(list);,菜单命令

27、处理方法,public void commandAction(Command command,Displayable arg1)if(command.getLabel().equals(删除)int r=listlook.getSelectedIndex();String temp=listlook.getString(r);data.delete(temp);listlook=data.get();listlook.addCommand(new Command(返回,Command.EXIT,1);listlook.addCommand(new Command(删除,Command.OK,1

28、);listlook.setCommandListener(this);(Display.getDisplay(this).setCurrent(listlook);,if(command.getLabel().equals(返回)(Display.getDisplay(this).setCurrent(list);if(command.getLabel().equals(进入)int index=list.getSelectedIndex();if(index=0)(Display.getDisplay(this).setCurrent(add);if(index=1)listlook=da

29、ta.get();listlook.addCommand(new Command(返回,Command.EXIT,1);listlook.addCommand(new Command(删除,Command.OK,1);listlook.setCommandListener(this);(Display.getDisplay(this).setCurrent(listlook);,if(command.getLabel().equals(exit)trythis.destroyApp(true);this.notifyDestroyed();catch(MIDletStateChangeExce

30、ption e)e.printStackTrace();,Add类,Add类的主要功能是为记录存储系统添加信息,Add类继承于Form,因此可以作为屏幕类直接添加到屏幕上,在这个类中还提供了输入时间和内容信息的文本域,这个类的结构如下:数据域成员构造方法:Add(Memoire x,Data y)菜单命令处理方法:commandAction(Command command,Displayable arg1),Add类,public class Add extends Form implements CommandListenerprivate TextField time;private Te

31、xtField content;private Memoire memoire;private Data data;public Add(Memoire x,Data y)super(添加备忘信息);memoire=x;data=y;time=new TextField(时间,50,TextField.ANY);content=new TextField(内容,50,TextField.ANY);,this.append(time);this.append(content);this.setCommandListener(this);this.addCommand(new Command(返回

32、,Command.EXIT,1);this.addCommand(new Command(保存,Command.OK,1);public void commandAction(Command command,Displayable arg1)if(command.getLabel().equals(返回)memoire.show();if(command.getLabel().equals(保存)String t=time.getString();String c=content.getString();data.save(t+:+c);memoire.dialog();time.setStr

33、ing();content.setString();,MyComparator类,这个类实现了RecordComparator接口的compare()方法,可以按UTF字符串格式分别读取记录存储系统中两条记录信息,并将它们转换成整数类型,并比较大小,输出比较结果,这个结果可以帮助系统在显示记录存储系统中信息时按照时间降序排列。,MyComparator类,public class MyComparator implements RecordComparatorpublic MyComparator()public int compare(byte b1,byte b2)/按照从大到小排序try

34、 ByteArrayInputStream bais1=new ByteArrayInputStream(b1);DataInputStream dis1=new DataInputStream(bais1);String s1=dis1.readUTF();int e1=s1.indexOf(:);String t1=s1.substring(0,e1);t1=t1.replace(-,0);int m1=Integer.parseInt(t1);,ByteArrayInputStream bais2=new ByteArrayInputStream(b2);DataInputStream

35、dis2=new DataInputStream(bais2);String s2=dis2.readUTF();int e2=s2.indexOf(:);String t2=s2.substring(0,e2);t2=t2.replace(-,0);int m2=Integer.parseInt(t2);if(m1m2)return RecordComparator.PRECEDES;if(m1=m2)return RecordComparator.EQUIVALENT;if(m1m2)return RecordComparator.FOLLOWS;,catch(IOException e)

36、/TODO 自动生成 catch 块e.printStackTrace();return 0;/TODO 自动生成方法存根,Data类,Data类主要胜于提供操作记录存储系统中数据的方法,如保存、删除、获取记录。这个类教材中没有给出完整的类程序,这里给出完整的类供参考。,Data类,public class Dataprivate RecordStore rs;/定义RecordStore对象rspublic Data()try/创建名为“jilu”的RecordStore对象rsrs=RecordStore.openRecordStore(jilu,true);/捕捉记录存储系统已满异常ca

37、tch(RecordStoreFullException e)e.printStackTrace();,/捕捉记录存储系统没法找到异常catch(RecordStoreNotFoundException e)e.printStackTrace();/捕捉记录存储系统其他一切异常catch(RecordStoreException e)e.printStackTrace();,/delete(String x)方法的功能是从存储存储系统中删除一条符合其参数x指定的记录public void delete(String x)try/创建记录枚举对象re,由于enumerateRecords()方法

38、的前2个参数为null,/表示没有过滤条件和排序要求,因此得到枚举对象中将是记录存储系统中的全部记录RecordEnumeration re=rs.enumerateRecords(null,null,false);/通过循环从枚举对象中逐个提取记录,并将记录数据转换成UTF格式字符串/再将这个字符串与参数x比较是否相同,如果相同则删除该记录for(int i=0;i+)int id=re.nextRecordId();/取得下一条记录号byte b=rs.getRecord(id);/根据记录号取得记录内容/建立与记录内容数组关联的ByteArrayInputStream对象 bs Byte

39、ArrayInputStream bs=new ByteArrayInputStream(b);/建立与bs关联的DataInputStream对象ds DataInputStream ds=new DataInputStream(bs);String temp=ds.readUTF();/将读取的记录内容转换成UTF字符串if(temp.equals(x)/如果读取的字符串与x相同rs.deleteRecord(id);/删除该记录break;,catch(RecordStoreNotFoundException e)e.printStackTrace();catch(RecordStore

40、Exception e)e.printStackTrace();catch(IOException e)e.printStackTrace();,public List get()List list=null;try/创建记录枚举对象re,并将其数据按照MyComparator对象要求排序 RecordEnumeration re=rs.enumerateRecords(null,new MyComparator(),false);int count=re.numRecords();/取得re中的记录数String str=new Stringcount;/根据记录数建立字符串数组str/通过

41、循环从枚举对象中逐个提取记录,并将记录数据转换成UTF格式字符串/再将这个字符串保存到数组str中for(int i=0;icount;i+)byte b=re.nextRecord();ByteArrayInputStream bs=new ByteArrayInputStream(b);DataInputStream ds=new DataInputStream(bs);String temp=ds.readUTF();stri=temp;list=new List(“”,List.IMPLICIT,str,null);/将str中的字符显示在list中,catch(RecordStore

42、NotOpenException e)e.printStackTrace();catch(InvalidRecordIDException e)e.printStackTrace();catch(RecordStoreException e)e.printStackTrace();catch(IOException e)e.printStackTrace();return list;/返回list对象,public void save(String str)try/创建ByteArrayOutputStream对象 baos ByteArrayOutputStream baos=new Byt

43、eArrayOutputStream();/创建与baos关联的DataOutputStream对象 dos DataOutputStream dos=new DataOutputStream(baos);/调用dos的writeUTF()方法将字符串写入dos对象中,自动传递给关联的/baos对象,转换成ByteArrayOutputStream对象dos.writeUTF(str);dos.close();/调用baos的toByteArray()方法,将 str字符串转换成字节数组类型byte b=baos.toByteArray();/将已经转换成字节数组类型的数据写入记录存储系统中r

44、s.addRecord(b,0,b.length);/catch(IOException e)e.printStackTrace();,习题,1.什么是记录存储系统?什么是存储记录?两者之间有何区别与联系?2.请你写出一个程序片断,要求创建一个名为myRecordStore的记录存储系统,当该系统不已经存在时报告异常,该系统只允许创建者访问。3.在完成习题2的基础上为记录存储系统编程实现添加记录、获取记录、修改记录并删除记录的程序片断。4.用记录枚举接口实现查询记录存储系统中是否存在下一条记录,如果存在获取该记录数据,否则给出提示信息“记录查询完毕!”。5.教材“5.3.3 记录比较接口”这一节的程序片断中未完成字符串s1和s2比较大小的编程,请你将带有/部分的未实现编程的代码用程序实现它。6.记录存储系统高级操作中4个记录接口对象是什么?各有什么作用?7.请说明为何在增加或修改记录时需要借助DataOutputStream、ByteArrayOutputStream对象,而在获取记录时需要借助DataInputStream、ByteArrayInputStream对象。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号