您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 4 J2ME记录管理系统
记录管理系统陈旭东xudong_chen@tom.com2020年2月4日2内容•RMS概述•记录库操作•记录操作•监视记录库•记录的查询与排序RMS概述•记录管理系统(RecordManagementSystem,RMS)–小型、简单数据库管理系统–可以保存简单数据–可以将对象状态经过序列化之后,保存到记录管理系统•记录管理系统存在于设备特定的存储空间,称为RMS空间RMS•数据是保存在记录库(RecordStore)中,在记录库中的每一条数据也被称为记录(Record)。–记录库其实就是一个记录的集合,在RMS中,记录数据只是一个简单的字节数组(byte[])。–如果把一个记录库当成数据库表,那么该表只有两个字段:一个整数类型的记录ID和一个字节数组表示的记录数据。记录库和记录记录库(RecordStore)•RMS系统的核心就是记录库–在一个MIDletSuite的RMS空间中,可以有多个记录库,这些记录库的名称必须是唯一的。–记录库的名称最长为32个字符(Unicode字符),而且是大小写敏感的。–在不同的MIDletSuite中,可以有重名的记录库,RMS使用记录库的全名来区分这些记录库。•一个记录库全名的由3个部分组成:“MIDletSuite名+供货商名+记录库名”。•MIDletSuite的全名是由MIDletSuite名、供货商名和版本号三个属性组成的唯一名称访问记录库•不管记录是如何存储在MIDP设备之上的,都不允许MIDlet直接访问,MIDP应用必需通过RMSAPI才能访问RMS记录库属性•记录库属性包括:–名称–时间戳–版本号–下一条记录位置等–实现数据同步记录(Record)•记录是记录库中的数据。–记录库中的每条记录都有一个唯一的整数标识,称为记录ID(recordId),记录库中的第一条记录的记录ID值为1。–在每次向记录库中添加记录时,记录ID会依次递增。–每条记录的数据都是简单的字节数组,由记录ID唯一标识。–每个记录库中可以存在任意数量的记录,每个记录中的字节数组大小(字节数)也是可变的。–当记录库中的一条记录被删除后,原来的记录ID值不允许再次使用记录库操作•在MIDP中,所有RMS相关的类都位于javax.microediton.rms包中–只提供RecordStore类来保存和访问MIDP设备上的数据–创建记录库、增加记录、删除记录、更新记录、获取记录库状态创建和打开记录库•使用RecordStore类提供的openRecordStore()方法才能创建或打开记录库,三种使用格式–打开或创建指定名字的记录库•publicstaticRecordStoreopenRecordStore(StringrecordStoreName,booleancreateIfNecessary)–用于打开或创建可以和其他MIDletSuite共享的记录库•publicstaticRecordStoreopenRecordStore(StringrecordStoreName,booleancreateIfNecessary,intauthmode,booleanwritable)–打开已经存在的、属于其它MIDletSuite的记录库•publicstaticRecordStoreopenRecordStore(StringrecordStoreName,StringvendorName,StringsuiteName)关闭记录库•在使用完记录库之后,必须关闭记录库以释放系统资源•RecordStore类方法–publicvoidcloseRecordStore()•需要注意的是,只有在调用closeRecordStore()方法的次数和调用openRecordStore()方法的次数相等,该记录库才会真正被关闭。也就是说,只要还有MIDlet在使用该记录库,记录库就不会被关闭。•如果一个MIDlet关闭了记录库之后还试图执行记录库操作(包括关闭记录库),就会产生RecordStoreNotOpenException异常删除记录库•RecordStore类的方法–publicstaticvoiddeleteRecordStore(StringrecordStoreName)–MIDletSuite只允许删除自己的记录库。–在删除记录库前,该记录库必须为关闭状态,否则会产生RecordStoreException异常。–如果记录库不存在,则会发生RecordStoreNotFoundException异常2020年2月4日13记录库属性操作•改变访问模式–publicvoidsetMode(intauthmode,booleanwritable)•获取记录库列表–publicstaticString[]listRecordStores()•获取记录库属性–publiclonggetLastModified()–publicStringgetName()–publicintgetNextRecordID()–publicintgetNumRecords()–publicintgetSize()–publicintgetSizeAvailable()–publicintgetVersion()2020年2月4日14记录库操作实例•记录库操作工具类:RecordStoreUtil.java•记录库属性操作:TestRecordStore.java记录操作•将记录数据存储到记录库中、获取、修改和删除记录库中的记录–增加记录–获取记录–修改记录–删除记录–记录操作实例增加记录•RecordStore类中方法:–publicintaddRecord(byte[]data,intoffset,intnumBytes)–在记录库中增加一条新的纪录–只提供写入字节数组(byte[])的方法,其他类型的数据需将其转换为字节数组才能写入记录库中2020年2月4日17获取记录•RecordStore类中有两种方式来获取记录。–方式1:直接获取记录数据:•publicbyte[]getRecord(intrecordId)–方式2:获取记录数据,并将记录数据复制到指定缓冲区的指定位置:•publicintgetRecord(intrecordId,byte[]buffer,intoffset)–返回的数据是记录库中数据的副本•对此数据的修改,并不会影响记录库中的数据2020年2月4日18修改记录•RecordStore类中方法–publicvoidsetRecord(intrecordId,byte[]newData,intoffset,intnumBytes)–在该方法运行后,调用getRecord(intrecordId)方法就会返回一个numBytes大小的字节数组的记录数据。2020年2月4日19删除记录•RecordStore类中删除指定记录的方法–publicvoiddeleteRecord(intrecordId)–参数recordId指定被删除记录的ID。该记录ID不再被重新使用。2020年2月4日20记录操作实例•由于记录库中只保存字节数组数据,其他任何类型的数据都需要转换为字节数组才能保存,同时,从记录库中读取的数据也是字节数组,也需要作相应转换才能恢复成所需要的数据类型。•记录库操作工具类:RecordStoreUtil.java•记录操作:TestRecord.java复合数据的处理•在实际应用中,一条有实际含义的记录数据可能包含有多个不同类型的数据。–例如,一个通讯录的纪录可能包含有如下的字段:姓名、性别、年龄、联系电话、电子邮件等,以Java类来描述:AddressList.java–使用预定义的java.io包中的ByteArrayOutputStream、ByteArrayInputStream、DataOutputStream和DataInputStream类可以实现字节数组的转换:AddressList.java–通讯录记录的操作实例:TestAddressListRecord.java2020年2月4日22监视记录库•一个记录库可以被同一个MIDletSuite中的所有MIDlet来访问。当记录库中的数据发生改变(如增加、修改和删除纪录)时,在RMS中,提供记录库事件处理接口RecordListener来监视记录库的变化。•在同一个MIDletsuite中,任何实现了RecordListener接口的对象都可以注册到记录库的实例,监听该记录库的数据改变事件。监视记录库RecordListener接口•RecordListener接口定义了如下的三个方法:–publicvoidrecordAdded(RecordStorerecordStore,intrecordId)•当记录库中新增记录时自动调用。传递的参数分别为对应的记录库和新增的记录的ID。–publicvoidrecordChanged(RecordStorerecordStore,intrecordId)•记录库中记录被修改时自动调用。传递的参数分别为对应的记录库和被修改的记录的ID。–publicvoidrecordDeleted(RecordStorerecordStore,intrecordId)•记录库中记录被删除时自动调用。传递的参数分别为对应的记录库和被删除的记录的ID。–简单的记录库监听器:SimpleListener.java2020年2月4日25注册记录库监听器•RecordStore类用于注册监听对象方法:–publicvoidaddRecordListener(RecordListenerlistener)•RecordStore用于删除监听对象的注册方法–publicvoidremoveRecordListener(RecordListenerlistener)•典型的注册监听器的代码://打开记录库RecordStoreanRMS=RecordStore.openRecordStore(TestRMS,true);//该记录库注册监听器,这里为例4-10定义的TestListener类的实例anRMS.addRecordListener(newTestListener());2020年2月4日26监视记录库变化实例•监视记录库的增加、删除、修改操作,并将监视结果显示出来–记录库监听器:TestListener.java–监视记录库改变:TestRMSMonitor.java2020年2月4日27记录的查询与排序•为了实现对记录库中记录的查询和排序操作,需要使用RMS的相关接口来实现记录的比较、记录的过滤和记录的遍历。记录的比较•在RMS中,提供了一个用于比较记录库中记录的接口:RecordComparator接口–实现RecordComparator接口需要实现一个compare()方法:•publicintcompare(byte[]rec1,byte[]rec2)–字符串纪录的比较器类:TestComparator.java–字符串纪录的比较:TestRecordComparator.java2020年2月4日29记录的过滤•在RMS中提供一个记录过滤接口RecordFilter–实现RecordFilter接口需要实现方法:•publicbooleanmatches(byte[]candidate)–纪录过滤器类:TestFilter.java–使用纪录过滤器类:TestRecordFilter.java2020年2月4日30记录的遍历•不管新增、修改或删除记录库的记录,都会涉及到记录ID。–由于记录ID是在记录写入记录库时就固定的,在记录被删除后,该ID不会被后来写入的记录所占用,因此不能保证所有的记录ID目前还在记录库中。•RMS提供RecordEnumeration接口来实现记录库中记录的遍历–nextRecord()、previousRecord()–nextRecordId
本文标题:4 J2ME记录管理系统
链接地址:https://www.777doc.com/doc-3479545 .html