欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:5659059       资源大小:386.97KB        全文页数:56页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    第5章记录存储系统,主讲教师:贾震斌,本章教学目标,理解记录存储系统的作用和功能;掌握记录存储系统创建、打开、关闭操作方法;掌握在记录存储系统中增加、获取、删除和修改记录的操作方法;掌握记录存储系统的记录枚举接口、记录过滤接口、记录比较接口、记录监听接口的功能和常用方法掌握“备忘录实例”编程、调试及运行。,本章学习建议,从理解引进记录存储系统的原因,掌握记录存储系统功能和方法;学习中注意比较与掌握记录存储系统中与之对应的概念,比如数据库中存在着数据库、数据表、记录、字段的概念,与记录存储系统中相应概念的区别联系;本章的难点是理解记录存储系统中记录枚举接口、记录过滤接口、记录比较接口、记录监听接口的功能和常用方法的使用。随着学习内容的深入,应该更加重视综合实例的分析、编程、调试和运行,以便更好地理解学习内容。,本章目录,5.1 记录存储系统概述5.2 记录存储系统基本操作5.3 记录存储系统高级操作5.4 备忘录实例习题,5.1 记录存储系统概述,为了增加程序的灵活性,有必要将程序中数据和程序分开,从而实现改变数据不必修改程序的要求,进而实现对数据的管理(包括数据的增加、修改、插入、删除、查找等处理)功能,将就产生了对数据库的需要,本章介绍的记录存储系统,本质上是J2ME的“数据库”。对于J2ME的MIDP设备来说,所谓记录存储系统是一种存储机制,以便退出系统后仍然可以让数据永久保存;每个记录存储都有一个名字,在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 openRecordStore(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程序才可以访问它;其值为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”的记录存储系统,如果该系统不存在则创建个新的记录存储系统,关闭记录存储系统的方法,Void closeRecordStore()如果记录存储系统中有多个记录存储被打开,只有当所有记录都被关闭后,才会最终关闭整个记录存储系统,删除记录存储系统的方法,static void deleteRecordStore(String recordname)String recordname:记录存储系统名注意:删除记录存储系统和后面将介绍删除存储记录这两个概念的区别。,获得记录存储系统中记录总数的方法,int getNumRecords()注意:这个方法属于RecordStore 对象,取得的是整个记录存储系统记录总数,与后面RecordEnumeration对象的获取记录数方法不同:(1)两个方法所属对象不同;(2)RecordStore 对象中的方法统计的是整个记录存储系统中的记录数,RecordEnumeration对象中的方法统计是本对象中的记录数,通常小于或等于整个记录存储系统中的记录数。,5.2.2 增加记录,记录存储系统和存储记录是两个不同概念,但两者又是紧密联系的。记录存储系统包含着一条条存储记录,两者的关系如同数据库与数据记录的关系。每条存储记录都是有一个唯一的ID号,首条记录ID号默认值是1,其后添加的记录ID 号随着记录数的增加而自动增长。即使其中一条记录被删除了,也不会影响其增加的下一条记录的ID号。,增加记录的方法,public int addRecord(byte data,int offset,int numBytes)byte data:添加的记录内容 int offset:添加记录在数组里的起始下标int numBytes:添加记录的字节数添加成功后返回的记录ID号注意:从这个方法的第1个参数可以看出添加的记录类型必须是byte,但在实际应用中需要添加的记录类型是多种多样,如字符、字符串、整数、浮点数、逻辑数等,这就要求在使用添加记录方法addRecord()前首先将其他数据类型转换为byte型数据,然后才能使用这个方法。,将数据转换为字节型的类,DataOutputStream、ByteArrayOutputStream这两个类配合可以完成将数据转换为字节型数据的工作,方法如下:/首先创建一个ByteArrayOutputStream 对象,这个对象可以将得到的数据转换化字节数组型数据输出ByteArrayOutputStream bs=new ByteArrayOutputStream();/将ByteArrayOutputStream 对象作为参数,创建与这个对象关联的DataOutputStream 对象,DataOutputStream 对象提供了将各种基本JAVA数据类型转换为数据输出流的方法DataOutputStream ds=new DataOutputStream(bs);/调用DataOutputStream 对象的方法writeInt()将int型 数据转换为数据输出流,以便传递给ByteArrayOutputStream 对象;ds.writeInt();ds.close();/将ByteArrayOutputStream 对象中的字节数组数据取出存入字节数组 b中byte b=bs.toByteArray();注:关于DataOutputStream、ByteArrayOutputStream这两个类的说明可以参考WTK Documentation。,5.2.3 获取记录,获取记录存储系统中记录的方法:byte getRecord(int recordID)int recordID:记录号注意:记录存储系统中存储的数据只能是字节数组类型byte,但在实际应用中需要的记录类型同样是多种多样,这就要求将从记录存储系统取得的数据转换成实际需要的数据类型,如字符、字符串、整数、浮点数、逻辑数等,DataOutputStream、ByteArrayInputStream这两个类配合可以完成这个工作,关于这两个类的说明可以参考WTK Documentation。,例程,/从记录存储系统中取得字节数组型数据存入b中byte b=rs.getRecord(id);/创建与b关联的ByteArrayInputStream 型对象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)是UNICODE的一种变长字符编码,由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)intrecordId:被替换数据的记录号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 记录存储系统高级操作,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(过滤器)参数:设置需要查找记录的过滤条件comparator(比较器)参数:设置记录排序updat参数:可以设置当记录存储内容发生变化时 RecordEnumeration 对象取得的记录是否随着变化这个对象的功能比用RecordStore对象的getRecord()方法获取记录功能更为强大,RecordEnumeration 对象的方法,void rebuild():重新创建对象以便更新数据int nextRecordId():获得下一条记录号byte nextRecord():获得下一条记录数据int previousRecordId():获得前一条记录号byte previousRecord():获得前一天记录数据void reset():将对象索引恢复到刚创建时状态boolean hasNextElement():判断是否还有下一条记录boolean hasPreviousElement():判断是否还有前一条记录int numRecords():返回对象中记录总数(注意与RecordStore获取记录总数方法的区别),RecordEnumeration 对象读取数据方法,RecordEnumeration re=rs.enumerateRecords();while(true)if(re.hasNextElement()=false)break;int id=re.getRecordID();byte b=rs.getRecord(id);,5.3.2 记录过滤接口,RecordStore 对象的enumerateRecords 方法中的过滤器参数类型本身也是一种接口对象,即记录过滤接口对象RecordFilter,这个接口可以用来过滤出符合条件的数据记录,接口提供了抽象方法用来实现过滤方法:public boolean matches(bytecandidate)matches()方法的参数,记录过滤接口实现方法,下面程序中matches()方法的参数为记录存储系统中某条记录的数据,希望与该数据相匹配的记录被选中时,就让matches()方法返回true,否则返回false。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 方法中的比较器参数的类型本身也是一种接口对象,即记录比较接口对象RecordComparator,可以用来对数据记录排序进行比较,这个对象提供了抽象方法用来实现记录比较接口方法:int compare(byte data1,byte data2)byte data1,byte data2:两条记录该方法返回值有3种:RecordComparator.EQUIVALENT:表示两条记录没有顺序RecordComparator.FOLLOWS:表示data1在data2之后RecordComparator.PRECEDES:表示data1在data2之前,记录比较接口实现方法,class MyFilter implements RecordComparatorpublic 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 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 added 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 addRecordListener(RecordListener listener),5.4 备忘录实例,本例程是一个综合性较强的程序,包含了前面各章及本章编程方法,务必认真阅读后上机实现。,程序结构分析,Memoire:主类,完成创建List类型主界面、为主界面设置菜单命令、监听器及菜单处理方法,创建自定义类的对象。Add:自定义类,完成添加信息功能,这是一个继承于Form的Displayable型屏幕类,以便可以在它里面添加输入时间和内容信息的文本域。MyComparator:自定义类,完成在显示信息时按照信息时间降序排序。Data:自定义类,实现对记录存储系统的操作,包含保存、删除、查看信息的方法。,Memoire类,定义数据成员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,Command.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);,菜单命令处理方法,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);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=data.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(MIDletStateChangeException 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 TextField 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(返回,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.setString();content.setString();,MyComparator类,这个类实现了RecordComparator接口的compare()方法,可以按UTF字符串格式分别读取记录存储系统中两条记录信息,并将它们转换成整数类型,并比较大小,输出比较结果,这个结果可以帮助系统在显示记录存储系统中信息时按照时间降序排列。,MyComparator类,public class MyComparator implements RecordComparatorpublic MyComparator()public int compare(byte b1,byte b2)/按照从大到小排序try 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 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)/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);/捕捉记录存储系统已满异常catch(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()方法的前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 ByteArrayInputStream 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(RecordStoreException 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/通过循环从枚举对象中逐个提取记录,并将记录数据转换成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(RecordStoreNotOpenException 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 ByteArrayOutputStream();/创建与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();/将已经转换成字节数组类型的数据写入记录存储系统中rs.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对象。,

    注意事项

    本文(【教学课件】第5章记录存储系统.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开