网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.JAVA - IO包的学习引导文章.
.Java中对文件的操作.
.用Java实现的一个C/S完整聊天程序.
.详细解析抽象类和接口的区别.
.您的利用Java平台的特性建造一个.
.Jetspeed开发文档2.
.Tomcat 中通过 JNDI 配置访问数据.
.JavaCollections--HashMap深度分.
.如何加载并显示较大的图形文件?.
.完全掌握java中的"包".
.用struts向数据库中储存图片.
.JNI完全手册.
.Windows CE PocketPC上的Java编程.
.高级技术分析:绿色和本地线程简单.
.Java连结数据库内幕.
.Weblogic60中打包时Helper类的位.
.垃圾自动收集系统指导(2).
.editplus能够编译java嘛? 如何设.
.程序安装,升级及卸载核心部分(.
.关于 MVC 模式中的通知机制.

J2ME编程最佳实践之灵活的RMS应用

发表日期:2008-1-5


  MIDP应用程序的标准持久化方案就是使用RMS。RMS类似于一个小型数据库,RecordStore相当于数据库的表,每个“表”由若干记录(Record)构成,一条记录就是一个用int表示的记录号RecordID和用byte[]表示的内容。记录号可以看作是“主键”,byte[]数组存储内容。

  RMS提供的记录操作可以实现根据ID直接获得记录,或者枚举出一个表中的所有记录。

  枚举记录是非常低效的,因为只能比较byte[]数据来确定该记录是否是所需的记录。通过ID获得记录是高效而方便的,类似于SQL语句“SELECT byteArrayData FROM recordStoreName WHERE RecordID=?”。然而,通常应用程序很难知道某条记录的ID号,而RMS记录的“主键”又仅限于int类型,无法使用其他类型如String作为“主键”来查找。因此,对于需要存取不同类型对象的应用程序而言,就需要一个灵活的RMS操作框架。

  我们的基本设想是,假如能使用String作为“主键”来查找记录,就能非常方便地获得所需的内容。例如,应用程序设置可以通过"sys.settings"获得byte[]数组,并依次读取出设置,用户登录信息可以通过"user.info"获得byte[]数组,再分解出用户名和口令。

  因此,我们实现一个StorageHandler类,提供唯一的RMS访问接口,使得其他类完全不必考虑底层的RMS操作,只需提供能标识自身的一个String即可。

  假如我们能实现一种类似于数据库索引的查找表,就能根据String要害字查找某条记录。因此,我们使用一个名为"index"的RecordStore来存储所有的索引,每一条索引都指向某一条具体记录的ID,设计一个IndexEntry表示一条索引:

class IndexEntry {
    private int selfId;   // IndexEntry的ID
    private int recordId; // 对应记录的ID
    private String key;   // 访问记录的Key
}

  根据索引查找,分3步进行:

  1.在名为"index"的RecordStore中根据String查找对应的IndexEntry。

  2.取出IndexEntry,获得记录ID号。

  3.根据ID号获得另一个RecordStore的记录,然后就可以读取、更新和删除该记录。

  如下图所示:

J2ME编程最佳实践之灵活的RMS应用

  由于IndexEntry保存的数据很少,为了加快查找速度,可以在应用程序启动时,把所有的IndexEntry读入一个Vector,在后面的操作中更新这个Vector并与RecordStore保持同步。

  为了处理不同类型的数据,所有可通过StorageHandler存取的类都必须实现一个Storable接口:

public interface Storable {
    String getKey();
    void getData(DataOutputStream output) throws IOException;
    void setData(DataInputStream input) throws IOException;
}

  前面已经提到,在MIDP应用程序中,序列化一个类的最佳方法是使用DataInputStream和DataOutputStream。因此,需要持久化的类可以通过getData()和setData()方法非常方便地存取。假定应用程序的类UserInfo保存了用户的登录名、口令和是否自动登录的信息:

public class UserInfo {
    String username;
    String passWord;
    boolean autoLogin;
}

  为了能将UserInfo存入RMS,需要实现Storable接口:

class UserInfo implements Storable {
    String username;
    String password;
    boolean autoLogin;
    public String getKey() { return "user.info"; } // 提供一个唯一标识符即可
    public void getData(DataOutputStream output) throws IOException {
        output.writeUTF(username);
        output.writeUTF(password);
        output.writeBoolean(autoLogin);
    }
    public void setData(DataInputStream input) throws IOException {
        username = input.readUTF();
        password = input.readUTF();
        autoLogin = input.readBoolean();
    }
    // getters here...
}


上一篇:在J2ME程序中实现声音播放 人气:564
下一篇:Java中常见的异常 人气:871
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐