当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>J2ME

JavaME的RMS通用持久化框架

    在写JAVAME程序的时候,我们经常需要保存一些数据到手机里面,也经常希望能把对象也保存到手机里面,但是JAVAME里面没有反射机制,也没有java.io.Serializable接口,所以没有序列化的机制,要保存对象的话,就得自己动手了。

    在JAVAME中,程序的数据保存的地方,无外乎两种,一种是把数据保存在RMS里面,这是所有的JAVAME的手机都支持的,还有一种就是把数据保存在手机的文件系统里面,这个不是所有手机都能支持的,只有支持JSR075的手机,才支持把数据保存在文件系统里面,并且如果你的程序没有经过签名的话,你每次保存或者读取,手机都会弹出恼人的提示,是否允许程序访问文件系统。所在我一般都是把数据存在RMS里面,因为读写RMS是安全的,并且也是不需要手机提示的。因为我们的RMS数据是存在一个特殊的地方。但是JAVAME的RMS功能非常底层,为了保存一些数据,我们必须和byte[]打交道,所以我就产生了,在此之前封装一层自己的程序的想法,这样封装好以后,使用起来就非常方便了。只要实现了相关接口,就可以享受到比较易用的方法了。

    此框架总共包括了四个类,分别如下:Serializable类,它是一个接口,类似于JAVASE里面的Serializable接口,唯一不同的就是,JAVASE里面的接口是一个空接口,只做标记用的,而这里的这个接口是有方法需要实现的。

    Lazy类,它也是一个接口,它定义了一些方法,如果你的对象比较大,需要惰性加载的时候,可以实现此接口,并且此接口是Serializable接口的子类,也就是说实现了Lazy接口,你就相当于实现了Serializable接口。

    RMSUtil类,此类是一个工具类,用于统一进行RMS的相关操作,也是此框架的核心类。

    RecordFetcher类,也是一个接口,它继承了RecordComparator, RecordFilter接口,在取数据的时候,需要用到它。

    好了,下面我们就开始看代码吧。

/*
 2  * To change this template, choose Tools | Templates
 3  * and open the template in the editor.
 4  */
 5 package com.hadeslee.mobile.rms;
 6 
 7 import java.io.IOException;
 8 
 9 /**
10  * 一个可自己串行化的类所要实现的接口
11  * @author hadeslee
12  */
13 public interface Serializable {
14 
15     /**
16      * 把自己编码成字节数组的格式
17      * @return 字节数组
18      */
19     public byte[] serialize() throws IOException;
20 
21     /**
22      * 把一个对象用此字节数组进行重装
23      * @param data 字节数组
24      */
25     public void unSerialize(byte[] data) throws IOException;
26 
27     /**
28      * 设置此对象序列化后对应的存储对象的ID
29      * @param id ID
30      */
31     public void setId(int id);
32 
33     /**
34      * 得到此对象序列化后的ID
35      * 此方法唯有在反序列化后的对象上调用才有效
36      * 如果一个对象是没有序列化的,那么它的ID是-1;
37      * @return ID
38      */
39     public int getId();
40 }
41


 1 /*
 2  * To change this template, choose Tools | Templates
 3  * and open the template in the editor.
 4  */
 5 package com.hadeslee.mobile.rms;
 6 
 7 import java.io.IOException;
 8 
 9 /**
10  * 可以延迟加载的对象必须要实现的接口
11  * @author binfeng.li
12  */
13 public interface Lazy extends Serializable {
14 
15     /**
16      * 实现此接口的类要实现的方法
17      * 可以用于延迟加载某些属性。比如
18      * get("ImgData"),get("fullImage")..等等
19      * 由于J2ME不支持注释也不支持反射,所以只能以
20      * 此种方法来进行模拟了
21      * 此方法是RMSUtil要存对象的时候调用的,这样就可以把
22      * 一个对象的不同部份存到不同的RMS里面去了
23      * @param key 要得到的某性的键
24      * @return 其对应的值
25      * @throws IOException 
26      */
27     public byte[] getAttach(Object key)throws IOException;
28 
29     /**
30      * 当把某个附属的对象保存进去以后,所要调用的
31      * 方法,此方法告诉主体,它的那个附件被保存后
32      * 在RMS里面对应的ID是多少
33      * @param key
34      * @param id
35      */
36     public void savedAttach(Object key, int id);
37 
38     /**
39      * 得到此对象所支持的所有的key的数组
40      * @return KEY的数组,不能为NULL
41      */
42     public Object[] getAttachKeys();
43 
44     /**
45      * 此对象的附属对象所存的RMS的名字
46      * @return RMS的名字
47      */
48     public String getNameOfAttachRMS();
49 }
50


 1 /*
 2  * To change this template, choose Tools | Templates
 3  * and open the template in the editor.
 4  */
 5 package com.hadeslee.mobile.rms;
 6 
 7 import javax.microedition.rms.RecordComparator;
 8 import javax.microedition.rms.RecordFilter;
 9 
10 /**
11  * 此类是一个继承了两个接口的接口,并且添加了自己
12  * 的方法,自己的方法是用于通知数量以及开始取的位置
13  * 只是为了方便于传递参数以及以后扩展
14  * @author binfeng.li
15  */
16 public interface RecordFetcher extends RecordComparator, RecordFilter {
17 
18     /**
19      * 从哪个下标开始取
20      * @return 下标
21      */
22     public int getFromIndex();
23 
24     /**
25      * 最多取多少条记录
26      * @return 记录
27      */
28     public int getMaxRecordSize();
29 }
30

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接