RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操作。在这个包里面总共包括四个接口、一个类和五个异常。由此可见RMS设计的非常小巧,这正是为了满足移动信息设备资源受限的需求。
五个问题
1,什么是持久性存储
持久性存储简单的理解就是数据不因为程序的退出而丢失,一般我们在程序中声明的变量都是存储在stack或者heap上的,程序退出后这些数据会被清除以释放资源。而存储在RMS中的数据是不会被清除的。
2,RMS中按照Record来存储的,ID是不是等于索引
ID和索引的区别还是很大的,ID从1开始计数,这和数组的0开始计数有一些不同。ID可以是不连续的,当一个ID标记的Record被删除后那么对应的ID也就变得无效了。ID是不能重复使用的。
3,RMS对存储数据格式没有具体的要求
只要数据可以被转换成byte[]那么这个数据就可以存储在RMS中,取出的时候仍然是byte[]。因此这就要求我们开发人员来描绘数据的样子,因为RMS只是负责把数据按照byte[]写入和读出。
4,一个MIDlet套件中的RecordStore可以被另外一个RecordStore
在MIDP1.0中不可以,在MIDP2.0中推出了共享机制,通过共享可以实现
5,命名规则
长度不超过32位的Unicode字符,大小写敏感且在MIDlet套件里面是唯一的。
具体使用使用
1, 首先应该清楚RecordStore就相当于一个数据库,你必须新建一个这样的数据库才可以开始使用RMS进行存储读取数据。新建RecordStore非常简单,可以使用下面的静态方法static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary)
注意,后面的boolean类型的createIfNecessary表示,如果标记为true的时候,那么RecordStore不存在就创建它。关闭RecordStore使用closeRecordStore()。在RMS中另外一个重要的概念就是Record,这就像数据库中一行一行的数据一样。下面我们首先对RecordStore中的方法进行区分,有些是用来获得RecordStore信息的有些则是用来获得Record信息的。
(1),获得RecordStore信息
int getVersion()
int getSize()
String getName()
long getLastModified()
(2),获得Record信息
int getNumRecords()
int getNextRecordID()
int getRecordSize(int recordId)
2,对Record进行添加、修改、读取和删除。
(1),读取记录
byte[] getRecord(int recordId)
int getRecord(int recordId, byte[] buffer, int offset)
(2),添加记录
int addRecord(byte[] data, int offset, int numBytes)
(3),更新记录
setRecord(int recordId, byte[] newData, int offset, int numBytes)
(4),删除记录
deleteRecord(int recordId)
3, 前面我们提到了ID和Index是不同的,因为ID可能不连续,那么我们如何来遍历数据呢?很多人可能会想到使用for循环,但是由于id可能不连续,那么这个结果是无法预测的。程序很可能会失败。正是由于这样的原因,在RMS中提供了一个重要的接口RecordEnumeration。它可以遍历RecordStore中的数据。我们看看下面的方法。
RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated)
在这个方法中还包括了RMS中的另外两个接口RecordFilter和RecordComparator,他们是用来量身定制遍历的结果集的,你可以实现RecordFilter来决定要把什么样的数据筛选出来,通过实现RecordComparator来决定数据的排序。最后的参数keepUpdated,如果设置为true的话,那么它会跟踪RecordStore中的数据变化,并且会反映到我们列出的结果集中,要知道这是非常好费资源的操作,建议设置为false。RecordEnumeration相当于一个双向的数据链表。你可以通过调用nextRecordId()和previousRecordId()来不停的移动。
4, 创建可以被共享的RecordStore
我们可以通过下面的方法来实现,必须要把authmode设置为AUTHMODE_ANY。
static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary, int authmode, boolean writable)
访问RecordStore
如果另外一个MIDlet Suite中的MIDlet想访问的话,那么它需要知道要访问的MIDlet suite的vendorName和suiteName,一般我们可以从jad文件中得到这两个数据。我么使用如下的方法,
static RecordStore openRecordStore(String recordStoreName, String vendorName, String suiteName)
设计rms存储库(对底层方法的封装)
其实,midp已经提供了基本的操作,我们完全可以不做任何事情也照样可以实现我们的存储要求,但是,在实际开发中要是我们每遇到不同的存储数据都要我们通过流的形式来write和read的话,确实很不方便,也就是复用性太差了。所以在实际的开发中可能需要根据实际情况来封装一下底层的接口。
刚才已经说过,rms对数据格式是没有要求的,前提是你把所有的数据转化为byte[]就OK了,所以所有问题的就落实到了如何将实际数据序列化成byte[]和反byte[]为实际数据上面来了。
提示:
1, 我们在存储数据的时候就是把数据按照我们预先定义好的格式存放到一张表里面。
2, 表由很多个字段组成。
3, 字段由名称和属性(类型)组成。
分享到:
相关推荐
windows2003下配置RMS过程,以及windows2008下配置RMS过程笔记。全过程记录,亲自一边做一边写的文档。希望大家多多交流。
注释标题文档提供了多个使用示例,并与应用笔记、网站、Excel 工作表和专用相位噪声实验室测量设备中提供的其他相位噪声抖动计算器进行比较。 例子: >> f = [10^0 10^1 10^3 10^4 10^6]; Lf = [-39 -73 -122 -131...
根据相位噪声测量相对于频率计算RMS时间抖动,请参阅: [1] - “振荡器相位噪声和采样时钟抖动”(RETHNAKARAN PULIKKOONATTU) 链接: ...
(本文基于GWT提供的开发指南(Developer Guide),所采用的图片,例子均出自GWT,可以认为是GWT的学习笔记) GWT的核心是通过一个编译器(compiler)把Java代码翻译为JavaScript代码,开发期间,用户以类似开发AWT...
酒店RMS 收入管理系统(数据科学) 快速开始: %git clone <回购> %cd <回购> %python -m virtualenv venv %来源venv / bin / activate %pip install -r requirements.txt %jupyter笔记本
欧拉公式求长期率的matlab代码Jupyter_Notebooks 这是Jupyter笔记本的集合,...关于Zernike波前图的功率谱密度如何随空间频率衰减以及对RMS的影响的笔记本 “兔子和狼”。 游戏中的Python脚本,可模仿生态系统和种群
对于恒定DC或RMS电源电压,电流检测电路断路器工作良好,但是,对于可变电源电压(如笔记本电脑中的电池),功率检测更可靠。提出一种采用功率检测方式实现的电流断路器,介绍了其设计原理,该方法优于电流检测方式的...
对于恒定DC或RMS电源电压,电流检测电路断路器工作良好,但是,对于可变电源电压(如笔记本电脑中的电池),功率检测更可靠。提出一种采用功率检测方式实现的电流断路器,介绍了其设计原理,该方法优于电流检测方式的...
Xamarin.Forms默认的Entry在ios下是四周圆角样式的输入框,在安卓下是底部横线 有时候我们想自定义输入样式,比如 ...我们只需要稍微对demo修改一下就可以 // 这里不用改 public class MyEntry : Entry ...
深度预测房价EDA 在该项目中,使用Kaggle's competition数据集。 在此过程中,我们将经历: 使用IQR和z-score方法去除异常值 可视化categorical变量和continuous... RMS和R2分数 根据实际值可视化我们的预测 执照
RMS()可以有效使用。 每个优先级的任务数为1。 EDF (最早截止日期优先) 对内核服务的有限支持。 可配置的任务数。 锁定/解锁计划程序。 支持内存管理。 使用基本的内存管理器处理内存分区(即区域)中固定大小...