关于RMS,我们该知道的事(理论篇)
来源:互联网 发布:mse windows server 编辑:程序博客网 时间:2024/05/23 13:04
关于RMS,我们该知道的事(理论篇)
一 为什么要用RMS?
数据持久性存储在MIDP应用程序中不可缺少,当然在很多场合我们完全可以用文件存储的形式来实现持久性存储,但对于一些特殊的
case,RMS做得更好。
1.比如常见的小功能,登陆界面上有“记住用户名/密码”功能,这个最好是存储到RMS中。
2.我们用emulator在PC上调试程序,可以再控制台上看到打印的log信息,但是在真机上运行,我们是看不到这些信息的,那么调试
起来就会困难很多。这里可以用RMS来实现把真机运行的Log信息打印到这个小型DB中,后面可以通过一些程序实现查看RMS中的Log。
RMS重要性还体现在如下几个case上:
1.有个不能忽视的问题,由于J2ME安全机制的限制,每打开一次本地文件,都要提醒,当然签名的软件除外,对于普通开发者而言,
有时候是缺少这些硬件条件的。
2.有些J2ME手机不支持JSR75,也就是不能以文件的形式存储数据,那么RMS也就是不得不采用的持久性存储技术。
二、RMS中相关的几个基本概念
1.RMS(Record Management System),即记录管理系统,就是一个应用在移动终端上的小型DataBase.
2.数据持久性,是指数据不因应用程序关闭或者移动电话更换电池而丢失。在代码里生成的变量,就是只当MIDlet suite启动之后才
分配存储空间,而shut down之后,KVM就会开始回收这些变量占用的空间。
3.RMS就是开发者和持久性存储空间之间的桥梁,API封装在javax.microedition.rms包内,包括1个类,4个接口,5个异常。主要操
作都封装在RecordStore类中。
三、关于JAR包中MIDlet-Data-Size属性值的问题
一些书上都说必须要设定一个默认值。但我在实际开发过2款手机中,都没有对这个参数修改过,使用中没有发现异常。或许设定了
性能会好些?可以肯定的一点是,在一些高配手机上,RMS的空间是可以动态分配的。低配手机中应该要注意这个参数的设定。
四、RMS数据读写流程
在RMS中存储的数据以记录(Record)为单元,记录不能单独存在,必须数据某个RecordStore。
RMS没有限制数据形式,记录可以是字符、数字、数组或图片,只要数据可以被转换为字节数组就可以。
应用程序负责对数据进行编码,将其转换为字节数组并转换为原始数据;从RMS中读出的数据依然是字节数组,应用程序需要对数据
进行解码并转换为原始数据。
所以想要存储多种类型的对象,要涉及到数据的编解码工作(见第六部分的序列化/反序列化)。
五、RMS的实现是线程安全的
RecordStore确保所有单个的记录存储操作都是原子、同步和串行化的。这条非常重要,如果没有这个机制,就要developer自己去做
线程同步,添加一定的工作量。线程安全,可以保证存储数据的完整性。
六、RMS与数据序列化/反序列化
在编写MIDP应用程序时,需要存储的数据不外乎如下几种:Java基本类型、文本、图片、Java对象。文本可以转化为String对象,图
片可以转化为byte[]或者int[]存储。
对于复杂一点的对象(包含多种基本类型的成员变量),我们需要对其进行序列化/反序列化处理,也就是编解码。DataOutputStream
和DataInputStream分别对OutputStream和InputStream进行了装饰,提供了操作Java基本类型的方法。在操作Java基本类型数据时,
使用DataOutputStream和DataInputStream得write***()和read***()方法配套使用。
在存储图片时候,要以byte[]/int[]形式存储,并且需要把数组长度(即图片数据大小)存储到RMS中,如果需要,图片尺寸信息也要
存储。
只有序列化/饭序列化的方法还不够,我们终极目标是把数据存储在移动电话的非挥发性内存中,需要在内存中申请一块空间,就要
借助ByteArrayOutputStream和对应的ByteArrayInputStream来封装DataOutputStream/DataInputStream。
七、开发中的难点(会在实践篇中给出几个样例)
1.数据序列化/反序列化很重要,也算是应用上的一个难点。
2.数据的索引和遍历
3.效率和性能的优化。
总结
RMS的使用其实是不方便的,但我们又不得不用。由于手机资源受限,不允许再提供更多API来封装数据,所以又这么一个小巧的应用
在移动设备上的DB,还是值得庆幸的。在与RMS交互的过程中,开发者不得不对数据进行加工和处理。
参考文献
《Java ME 核心技术与最佳实践》
David Dong
- 关于RMS,我们该知道的事(理论篇)
- 关于Dalvik,我们该知道些什么?
- [技术分享 - RMS 篇] 关于 RMS 服务器的缓存
- [技术分享 - RMS 篇] 关于 RMS 服务器的缓存 Part II: RMS 2.0 ADRMS
- Eclipse中【我们该知道,却不知道的】快捷键
- 关于数据科学家,我们应该知道的这些事
- 一切我们认为我们知道关于三星的Galaxy S4
- Thinkphp我们知道的事!
- 转帖MSDN的关于RMS文章1:RMS 技术参考、RMS 技术概述(RMS技术探讨QQ群:24893581 )
- 我们该关注的
- 关于BLE的android开发,你该知道的一切
- 关于iPhone 6的A8芯片我们已经知道这些
- 关于Solr/ES,我们不得不知道的十件事
- 关于Solr/ES,我们不得不知道的十件事
- 关于j2me中RMS的大小限制
- 关于j2me中RMS的大小限制
- 关于j2me中RMS的大小限制
- 关于内推,你该知道的点点滴滴
- ajax用户控件中读取session的问题
- what is DECODE function used for?
- 磁县实验学校
- 广告无法显示
- 每日英语-2009/09/10
- 关于RMS,我们该知道的事(理论篇)
- FCKeditor的js验证
- Java持久层选择Hiberante和iBATIS的时机
- joomla 字体太小
- socket 线程池
- 一些小技巧
- 10种AD采样的软件滤波方法
- 解析事件,信标,互斥对象区别
- 读《微软C编程精粹》的一些收获