[转载]RMS概念解析与使用指南

2023-10-21 03:50

本文主要是介绍[转载]RMS概念解析与使用指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RMS概念解析与使用指南
RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操作,那超出了本文的讨论范围。持久性存储在我们编写应用程序的时候经常要用到,比如纪录游戏的排行榜、记录用户输入的用户名和密码等。本文将主要从RMS的基本概念和使用指南方面进行介绍,目的在于给读者进行一定的指导。



RMS是首先在MIDP1.0中提出的,它所在的包是javax.microedition.rms,在这个包里面总共包括四个接口、一个类和五个异常。由此可见RMS设计的非常小巧,这正是为了满足移动信息设备资源受限的需求。下面我们先弄清楚几个概念。
  1. 什么是持久性存储?
    持久性存储简单的理解就是数据不因为程序的退出而丢失,一般我们在程序中声明的变量都是存储在stack或者heap上的,程序退出后这些数据会被清除以释放资源。而存储在RMS中的数据是不会被清除的。
  2. RMS的数据存储在哪里?
    MIDP规范中没有规定RMS的数据必须存储在哪里,而是由厂商来具体实现。一般存储在非挥发性的内存空间。因此这是对程序员透明的。
  3. RMS的容量最小为多少?
    MIDP中规定厂商实现RMS的时候,提供的存储空间不能小于8KB,例如笔者的Nokia 6108的RMS空间为30KB。
  4. RMS中按照Record来存储的,ID是不是等于索引?
    ID和索引的区别还是很大的,ID从1开始计数,这和数组的0开始计数有一些不同。ID可以是不连续的,当一个ID标记的Record被删除后那么对应的ID也就变得无效了。ID是不能重复使用的。
  5. RMS对存储在其中的数据格式有具体要求吗?
    答案是没有,只要数据可以被转换成byte[]那么这个数据就可以存储在RMS中,取出的时候仍然是byte[]。因此这就要求我们开发人员来描绘数据的样子,因为RMS只是负责把数据按照byte[]写入和读出。
  6. 在一个MIDlet套件中,RecordStore可以被共享吗?
    可以
  7. 一个MIDlet套件中的RecordStore可以被另外一个RecordStore访问吗?
    在MIDP1.0中不可以,在MIDP2.0中推出了共享机制,通过共享可以实现。

上面以7个问题的形势总结了RMS中需要注意的基本概念,下面我们看看如何使用RMS。一般初学者学习RMS的时候通常会被他们的方法给弄的不知如何下手,因为很多方法看上去很类似。这里我进行如下的总结,提供一些使用指南给大家。

首先读者应该清楚RecordStore就相当于一个数据库,你必须新建一个这样的数据库才可以开始使用RMS进行存储读取数据。新建RecordStore非常简单,可以使用下面的静态方法。

static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary)
注意recordStoreName应该是长度不超过32位的Unicode字符,大小写敏感且在MIDlet套件里面是唯一的,后面的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)

下面讲述如何对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)

前面我们提到了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()来不停的移动。关于RecordEnumeration的其他方法读者可以参考java doc进行学习。

最后一点需要说明的就是共享机制,这是在MIDP2.0中提供的新特性。允许一个套件中的RecordStore被另外一个访问,当然这是要在授权的模式下。首先我们看看原理图
2005129104723983.gif

如果MIDlet suite1在创建RecordStore1的时候,授权模式为AUTHMODE_ANY的话,那么其他的套件就有可能访问到RecordStore1,比如上图中的MIDlet suite2。通常这样的访问通过两个步骤来完成。

  1. 创建可以被共享的RecordStore
    我们可以通过下面的方法来实现,必须要把authmode设置为AUTHMODE_ANY
    static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary, int authmode, boolean writable)
  2. 访问RecordStore
    如果另外一个MIDlet Suite中的MIDlet想访问的话,那么它需要知道要访问的MIDlet suite的vendorName和suiteName,一般我们可以从jad文件中得到这两个数据。我么使用如下的方法,
    static RecordStore openRecordStore(String recordStoreName, String vendorName, String suiteName)

本文的主要目的是介绍RMS的基本概念以及为读者提供如何使用RMS中的方法提供一些指导。想进一步研究RMS,读者可以参考源码下载专区笔者提供的一个基于midp1.0实现的手机通信录。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131784/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-131784/

这篇关于[转载]RMS概念解析与使用指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251733

相关文章

IDEA与JDK、Maven安装配置完整步骤解析

《IDEA与JDK、Maven安装配置完整步骤解析》:本文主要介绍如何安装和配置IDE(IntelliJIDEA),包括IDE的安装步骤、JDK的下载与配置、Maven的安装与配置,以及如何在I... 目录1. IDE安装步骤2.配置操作步骤3. JDK配置下载JDK配置JDK环境变量4. Maven配置下

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php