MIDP为MIDlets提供了一种永久存储和后来读出数据的数据库解决方案,被称为Record Managerment System(RMS),是一种简单的基于记录的数据库。很显然,手机上的数据库系统不可能有PC上的强大功能。微小的存储空间也限制了它们的结构不能过于复杂。RMS是专门针对移动设备的服务的。
RMS
包中包括
RecordStore
类。在一个
MIDlet suite
包里的所有
MIDlet
都允许创建多个记录集,只要它们被赋于不同的名称。当
MIDlet
包从平台中被移除后,所有与该包有关的的记录集都同时会被移除。同一个包内的
MIDlets
可以直接互相访问它们的记录集,不同包内也可产生共享,但这需要有包的授权属性决定。访问模式会在准备提供共享的
RecordStore
建立时被创建。访问模式允许私有使用或访问。
RecordStore
的
API
采用了时间戳的概念,其长整型变量由
System
的
currentTimeMillis()
函数返回决定。
Record store
每次被修改后都会自动在其属性上附加上时间戳,这为同步化引擎和程序的控制都极为有效。
记录是字节数组。开发者可以利用
InputStream
的派生类
DataInputStream
、
DataOutputStream
以及
ByteArrayInputStream
、
ByteArrayOutputStream
将不同种类的数据类型打包,以字节流的形式发送和接收。
区别记录的唯一标记是他们的
ID
值,作为记录集的主键。第一项记录的
ID
是1,其后的每个记录
ID
递增。
Record
是以字节为基本单位来存放的,所以所有要写入
record
的数据都必须先将其转为字节才能写入,从
record
所读出来的数据也是字节,必须将其转换为原先写入时的数据类型才有意义。
然而读取或写入的字节数组都只能代表一个字段的信息,如果需要读取或写入多个字段就必须要将数据转换成字节信息,并且提供适当的机制来分隔这些信息。主要有两种方法:
1.
标记法。
将所有要存放的数据用字符串表示,但是在字段和字段之间以一个特殊的符号作为分隔。符号不能和字段内的数据相同的字符。
2
.利用输入/输出流
这一种方法较上一种复杂,但是较为实用。方法一中所有的字段只能以字符串的形式存储,要对这些字段作进一步的处理非常麻烦。利用输入输出流可以写入及读取不同数据类型的数据,做法是在写入数据时先将一个
DataOutputStream
数据流对象串接到一个
ByteArrayOutStream
数据流对象,然后再依字段的数据类型用
writeInt()
、
writeBoolean()
等方法写入,最后把
ByteArrayOutputStream
内的元素数据写入
record
中。反之若要读取数据,则先要串接一个
DataInputStream
对象和
ByteArrayInputStream
,依字段的数据类用
readInt()
、
readBoolean()
等方法读取。
本程序中主要存放在永久区的内容为用户得到的最高分数的记录。每次有新的更高的记录就会插入进相应的位置,将原来的记录排挤出记录。
通常在
MIDP
应用程序的手机执行环境中,所牵涉的内存有下列三种:
⒈应用程序存储内存
⒉
RecordStore
存储内存
⒊执行时期内存(
Java Heap
)
其中前两种是持久性的内存,关闭电源后还能保持数据的正确性,通常这两种内存所能存储的容量是合并计算的,这个上限对每种手机都不一样,大部分在一两百
KB
内。在这样的情况下需要在不影响原有功能的情况下适当的缩减
JAR
文件的大小,除了可以克服内存空间的限制外,也能大幅度缩短下载的时间(费用也降低了),势必会有更多的人愿意下载所开发的程序。其方法有:
第一,就是尽量缩短命名的长度。在应用程序内,对于所建立的类、接口、方法及变量名而言,都需要赋予一个识别的名称,所命名的名称每多一个字符就会在类文件内多产生一个字节,对于一个较复杂的应用程序而言就会增加为数不小的数据量。所有这些可以借助混淆器来帮助实现。
第二,减少复杂的程序结构,为一些共同的行为建立一个抽象类(
Abstract Class
)
来表示继承的子类的共通性。
第三,减少图形数据的大小。将
PNG
格式的小分辨率图象合并在一张大的高分辨率图象中,由于减少了
chunks
,将比合并前的总大小减少许多。
注:部分内容摘自Michael Morrison著 \李强译《 J2ME手机游戏编程入门 》及刘斌等著《J2ME手机开发入门》
本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/204445,如需转载请自行联系原作者