J2ME数据库编程.ppt_第1页
J2ME数据库编程.ppt_第2页
J2ME数据库编程.ppt_第3页
J2ME数据库编程.ppt_第4页
J2ME数据库编程.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 J2ME数据库编程,J2ME移动软件程序设计,知识点: RMS概述 Record Store 在Record Store中操作记录 记录的排序、查找 高效使用RMS的方法 本章导读: 本章将主要介绍如何使用J2ME的RMS系统来进行数据库编程,内容包括RMS概述, Record Store的操作,记录的排序、查找,以及如何编写高效的数据库程序的基本原则。,J2ME移动软件程序设计,5.1RMS概述,在J2ME MIDP中定义了一个简单的基于记录的数据库管理系统(Record Management System,RMS)。 RMS不同于在PC机或者是服务器上运行的数据库管理系统,RMS仅

2、提供最基本的数据管理功能 。,J2ME移动软件程序设计,5.2.1 Record Store 概述,5.2 Record Store,Record Store等同于数据库系统中的表(table),在RMS中是一个包含了一系列记录的文件。 在RMS中,使用RecordStore 类来代表Record Store。 Record Store的命名规则如下: Record Store的名字是大小写敏感的,可以最多由32个Unicode字符组成。 Record Stores将被创建在与MIDlet相同的目录下,不同MIDlet创建的Record Store将创建在不同的MIDlet目录下。 在每个MI

3、Dlet包中,Record Store的名字必须是惟一的。 一个MIDlet不能访问其他的MIDlet包中所创建的Record Store。,J2ME移动软件程序设计,5.2.2 操作Record Store的方法,创建Record Store RecordStore.openRecordStore(recordStoreName,true); 如果以recordStoreName为名字的Record Store不存在,RMS将创建一个新的Record Store。如果以recordStoreName为名字的Record Store已经存在了,RMS将不创建新的Record Store,只是将

4、已有的Record Store打开。,J2ME移动软件程序设计,打开Record Store: RecordStore.openRecordStore(recordStoreName,false); 假如要打开的Record Store存在,它将被打开。如果要打开的Record Store不存在,RMS将抛出一个RecordStoreNotFoundException异常。,J2ME移动软件程序设计,关闭Record Store: 方法closeRecordStore()用来关闭Record Store 。 closeRecordStore()方法并不直接关闭一个Record Store,因为

5、可能一个Record Store被几个进程或线程共享打开。因此,closeRecordStore()仅是通知J2ME的应用程序管理器一个进程或线程结束使用Record Store,只有当所有的进程和线程使用closeRecordStore()来通知程序管理器以后,程序管理器才会真正关闭Record Store。,J2ME移动软件程序设计,删除Record Store: deleteRecordStore(String recordStoreName)方法用来永久地删除Record Store。 在删除一个Record Store前,必须关闭一个Record Store,否则RMS将抛出一个Re

6、cordStoreException异常。 一个MIDlet仅能删除它能访问的Record Store。假如一个MIDlet要删除的Record Store不存在,RMS将抛出一个RecordStoreNotFoundException异常。,J2ME移动软件程序设计,5.2.3 Record Store的信息维护,Record Store中所有记录的数量 记录数量初始值为0,当一条记录被创建时,记录数量增加1;当一条记录被删除时,记录数量减1。 获取方法:public int getNumRecords() 版本号 通常开始是0,每次增加一个正数,通常是1。当一个Record Store被修

7、改了(例如添加、修改、删除一条记录),版本号都将增加。通过版本号,MIDlet可以很容易地知道一个Record Store是否被其他的进程或线程修改。 获取方法: public int getVersion(),J2ME移动软件程序设计,上次修改时间 Record Store上次被修改的时间,时间的格式使用System.currentTimeMillis()中定义的格式。当一个Record Store被修改时,上次修改时间和版本号同时被修改。 获取方法: public long getLastModified() 下一条记录的id号。 代表下一个增加到Record Store中的记录的记录号。

8、当addRecord()方法被调用时,下一条记录的id号将增加1。 获取方法: public int getNextRecordID(),J2ME移动软件程序设计,使用如下的方法可以获得一个Record Store的头信息: 上次修改时间: public long getLastModified() 下一条记录的id号:public int getNextRecordID(); Record Store中所有记录的数量:public int getNumRecords() 版本号:public int getVersion(),J2ME移动软件程序设计,5.3.1 记录概述,5.3 在Reco

9、rd Store中操作记录,在Record Store中的每一个数据称之为记录(record)。 在RMS中每一条记录的数据都存放在一个byte数组中,每一条记录由惟一的recordId来标识。 在RMS中,可以在一个打开的Record Store中添加、删除、检索和修改记录。,J2ME移动软件程序设计,5.3.2 添加记录,添加一条记录方法 public int addRecord(byte data,int offset,int numBytes) 在Record Store中添加的第一条记录的id号为1,随后添加的每一条记录的id号都比前一条记录的id号大1。 例:RecordAdd.j

10、ava 向Record Store中添加了两条记录,可以看到记录号在每次添加新的记录时都会增加。,J2ME移动软件程序设计,5.3.3 删除记录,删除一条记录方法 public void deleteRecord(int recordId) 当调用deleteRecord()时,且Record Store尚未打开,RMS将抛出一个RecordStoreNotOpenException异常。 假如要删除的记录id在Record Store中不存在,那么RMS将抛出一个InvalidRecordIDException异常。 如果出现其他错误,将抛出RecordStoreException异常。,J

11、2ME移动软件程序设计,在一个Record Store中,当一条记录被删除后,被删除记录的空间不会被释放,Record Store的记录文件并不会变短,而仅仅是Record Store中这条记录的数据块被标记为空闲,这样这个块在未来可以被其他记录使用。 例RecordDel.java,向Record Store中添加了两条记录,然后删除了一条记录。,J2ME移动软件程序设计,5.3.4 修改记录,修改一条记录方法 public void setRecord(intrecordId, bytenewData, intoffset, intnumBytes); recordId代表要修改的记录的i

12、d号 newData是新的记录内容 offset是修改的记录内容在原来记录的byte数组中的偏移量 numBytes是修改的记录中的字节数量 使用offset和numBytes,可以实现修改一条记录中的一部分,J2ME移动软件程序设计,修改记录例:TestStore .java 将一个Record Store中的记录读取出来,然后进行修改写入Record Store中,接着从Record Store中读取出来并显示在屏幕上,J2ME移动软件程序设计,5.3.5 监视记录的改变,使用RecordListener接口来监视记录的变化。当一个Record Store中的记录发生变化时,RecordL

13、istener就会被触发执行。 使用下面的事件处理函数来响应相应的事件 void recordAdded(RecordStore recordStore,int recordId) void recordChanged(RecordStore recordStore,int recordId) void recordDeleted(RecordStore recordStore,int recordId),J2ME移动软件程序设计,使用下面的方法添加或者删除RecordListener public void addRecordListener(RecordListener listener)

14、 public void removeRecordListener(RecordListener listener),J2ME移动软件程序设计,在J2ME的显示控件中,一个显示控件只能有一个事件监听函数,例如一个命令按钮只可以有一个CommandListener。 而RecordStore对象可以有多个RecordListener。 如果用户希望保持两个Record Store一致,就可以使用多个RecordListener来完成。 监视记录的改变例:RecordListenerExample .java,J2ME移动软件程序设计,5.3.6 遍历记录,Record Store中的每条记录都有

15、一个惟一的记录号,记录号不能重复使用。 如果删除了一条记录以后,这条记录的id就永远不会在这个Record Store中使用了。如果程序再访问这个id的记录,Record Store将抛出一个异常。 采用RecordEnumeration遍历记录,J2ME移动软件程序设计,例,用RecordEnumeration类来实现将一个Record Store的所有记录显示出来,而不出现访问不存在记录的错误。 public void readRecordsUpdate() try System.out.println(Number of records: + recStore.getNumRecords

16、(); if (recStore.getNumRecords() 0) RecordEnumeration re = recStore.enumerateRecords(null, null, false); while (re.hasNextElement() String str = new String(re.nextRecord(); System.out.println(Record: + str); catch (Exception e) System.err.println(e.toString(); ,J2ME移动软件程序设计,RecordEnumeration类中提供了如下的

17、方法来访问和遍历Record Store中的记录 void destroy(); boolean hasNextElement(); boolean hasPreviousElement(); byte nextRecord(); int nextRecordId(); int numRecords(); byte previousRecord(); int previousRecordId(); void rebuild(); void reset();,J2ME移动软件程序设计,5.3.7 创建多列表格,在RMS中,每个Record Store的数据仅能由一个byte数组来存放。 可以将一

18、个多列表格中每条记录的几个列的数据使用UTF-8方法来进行编码,然后把编码的数据一起存放在Record Store的byte数组中,这样就等效于在一个Record Store中建立了多列表格。 编码和解码的方法 多列表格的保存 检索多列表格,J2ME移动软件程序设计,5.4.1 使用RecordComparator对记录进行排序,5.4 记录的排序、查找,通过实现RecordComparator接口,对记录进行排序。 在RecordComparator中只有一种方法:compare() ,返回值是: EQUIVALENT:表示两条记录相等。 PRECEDES:表示第一条记录小于第二条记录。 F

19、OLLOWS:表示第一条记录大于第二条记录,J2ME移动软件程序设计,实现排序的简单例子 public class Comparator implements RecordComparator public int compare(byte rec1, byte rec2) String str1 = new String(rec1), str2 = new String(rec2); int result = pareTo(str2); if (result = 0) return RecordComparator.EQUIVALENT; else if (result 0) return

20、RecordComparator.PRECEDES; else return RecordComparator.FOLLOWS; ,J2ME移动软件程序设计,实现排序的简单例子(续) RecordStore rs; . / 创建一个排序的comparator Comparator comp = new Comparator(); / 当创建结果集合的时候应用comparator RecordEnumeration re = rs.enumerateRecords(null, comp, false); / 遍历所有的排序结果 while (re.hasNextElement() String

21、str = new String(re.nextRecord(); . ,J2ME移动软件程序设计,5.4.2 使用RecordFilter查找记录,使用RecordFilter接口在数据库中查询需要的数据。 使用RecordFilter对记录进行查找需要实现matches()方法。,J2ME移动软件程序设计,实现查找的简单例子 class SearchFilter implements RecordFilter private String searchText = null; public SearchFilter(String searchText) / 查找的文本 this.searchText = searchText.toLowerCase(); public boolean matches(byte candidate) String str = new String(candidate).toLowerCase(); / 查找匹配的文本 if (searchText != null ,J2ME移动软件程序设计,实现查找的简单例子(续

温馨提示

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

评论

0/150

提交评论