Java 手机程式设计入门 笔记

Optional Packages 厂商选择性实现包
Profile 高级API MIDP(Mobile Information Device Profile)
Configuration 底层 硬件 低级API
JCP(Java Community Process)  JSR(Java Specification Request) 
Configuration
CDC(Connected Device Configuration)
CLDC(Connected Limited Device Configuration)
Profile
MIDP2.0规范要求 95x54黑白屏幕 256K内存 8K非易失性内存 播放声音功能
Optional Packages
Wireless Messaging API(WMA):eg. SMS CBS MMS
Mobile Media API(MMAPI)
Java虚拟机
j2me参考实现为 KVM(硬件功能不强)和CVM(硬件功能较强)
HotSpot VM 新一代虚拟机 Classic VM传统虚拟机
j2se为JVM
MIDP应用程序:遵循MIDP规范开发的程序。包括应用程序主体JAR文件,描述文件JAD文件。
MIDP的部署分为:OTA(Over The Air)有无线通信网络将MIDP应用程序下载到设备上。
非OTA:方式较多- 传输线,红外线IrDA,蓝牙Bluetooth,MMS,Email附件。
嵌入式平台
1 Personal Java:
面向PDA产品开发。
系统平台PocketPC和Symbian OS,Windows CE。
模拟器:PJEE(personal Java Emulation Environmnet);Touchable是PJEE的最小实现版本。
2 j2me CDC
3 j2me CLDC
MIDP
MIDlet:和Servlet Applet一样的命名方式。是执行应用程序的基本单位。
MIDlet Suite:一个或多个MIDlet的集合。JAR就是包裹MIDlet Suite的压缩文件。
Manifest File(Manifest.mf,内部描述文件)描述了MIDlet Suite所包含的MIDlet的相关信息或MIDlet Suite地整体信息。
应用程序管理器(JAM):将MIDlet Suite安装/移除到机器,执行并管理MIDlet的生命周期。


不用AWT/SWING的原因:
移动设备CPU慢,内存小;没有鼠标,只是触控屏幕和简单的按钮;
屏幕小,不需要重叠窗口;消息处理机制负荷太重。

LCDUI高级API(Screen子类)具有移植性,对画面的掌控程度较低,组件的属性由系统来决定。
LCDUI低级API(使用Canvas的子类和Graphics类)对整个手机的画面具有完全控制权。
两者可以在同一个MIDLet里混合使用。

Displayable抽象类:javax.microedition.lcdui.Displayable的子类可以分成两大类:
Canvas和Screen。Canvas属于低级图形用户界面组件,Screen属于高级图形用户界面组件。
在同一时间,只能由唯一一个Canvas或Screen类的子类出现在屏幕上。
setCurrent()被调用时,前一画面就被取代,所以要自行保存当前画面。

事件处理:
在MIDP中,只要底层侦测到有事件发生,系统就会调用固定接口中的特定方法(回调函数),并传给它特定的参数。

和用户界面相关的回调函数:
1 经由abstract command (javax.microedition.lcdui.Command)
2 使用低级API时,如果机器上的按钮被按下或是触控屏幕被触动时,就调用对应的事件,即使用javax.microedition.lcdui.Canvas类。
3 屏幕重绘时,产生重绘事件,此时Canvas类的paint()被调用,并传入一个Graphics对象的引用。
4 调用Display类的callSerially()方法时,传入一个实现Runnable接口的类,其中的run()会被调用。

Command类
Displayable对象定义了addCommand()/removeCommand()方法
Command类三个参数的构造函数:Command c1=new Command("Back_1",Command.BACK,1);
Command类四个参数的构造函数:Command c1=new Command(短命令,长命令,类型,优先权);
取相应的值:getLabel() getLongLabel() getCommandType() getPriority()
八种类型:
BACK CANCEL EXIT HELP ITEM OK SCREEN STOP
并不会因为设定成某一种类就具有该类型“名称上”的功能。

CommandListener:事件处理接口
委托模型(Delegation Model)
setCommandListener()注册事件处理函数。
commandAction()被调用,当注册事件产生时。

Ticker类
跑马灯。Displayable子类都可以加入Ticker.setTicker()/getTicker()。

标题 setTitle()/getTitle()。


LCDAUI高级API之List 
Screen类有四个子类: Alert List TextBox Form
List根据Choice接口的定义,分为:
Choice.Exclusive(单选)
Choice.MULTIPLE(多选)
Choice.IMPLICIT(简易式的单选)
单选型
Image img=Image.createImage("/a.png");
List l=new List("List test",Choice.Exclusive);
l.append("banana",img);
l.append("apple",null);
display.setCurrent(l);
insert()可在特定项目后插入一个新项目。
set()可以重新设定某个项目。
……
System.out.println("You have choice the"+l.getSelectedIndex()+"item.");
System.out.println("the content is:"+l.getString(l.getSelectedIndex()));
多选型
List l=new List("List test",Choice.MULTIPLE);
……
int size=l.size();
for (int i=0;i<=size;i++){
 if(l.isSelected(i))
 {
  System.out.println("you have selected"+i);
 }
}
getSelectedFlags()传回一个Boolean数组,借此可了解那个选项被选中。
简易式单选
List l=new List("List test",Choice.IMPLICIT);
……
public void commandAction(Command c,Displayable s){
if(c==List.SELECT_COMMAND)
{
List tmp=(List)s;
int i=tmp.getSelectedIndex();
System.out.println("you have selected"+i)
}……}
Choice.IMPLICIT在用户选择后,立刻引发事件,并将List.SELECT_COMMAND通过commandAction()的第一个参数c传入。
如果不希望这样,可以setSelectCommand(null)将它关掉,此时c=null.
setSelectCommand(x)--x为另外一个Command对象,当List被选中后,x作为commandAction()的第一个参数传入。
setSelectCommand()后,这个Command--x会被addCommand()自动加到系统菜单。
removeCommand(c)如同:
setSelectCommand(null);
removeCommand(c);
Choice接口提供的FitPolicy机制,决定当文字内容过长时,该如何处理
Choice.TEXT_WRAP_ON-过长的文字自动换行
Choice.TEXT_WRAP_OFF-过长的文字自动被截断
Choice.TEXT_WRAP_DEFAULT-依照及其不同而不同,通常是前两种的一种


LCDAUI高级API之TextBox 
TextBox tb=new TextBox("title","initial text",10,TextField.ANY);
参数说明:
第一个为标题,第二个是初始内容,第三个是允许输入字符最大长度(Unicode码中文也算一个字),第四个是限制类型。
tb.setString()设置内容,tb.getString()取出内容。
tb.setMaxSize()设定长度,tb.getMaxSize()取出长度。
tb.size()返回当前内容长度。
最后一个参数是限制类型,如下:
限制储存内容的:
TextField.ANY
TextField.EMAILADDR
TextField.NUMERIC
TextField.PHONENUMBER    //电话号码的格式 如数字、星号、#、+ ,输入后可直接拨通电话(与拨号程序连接)
TextField.URL
TextField.DECIMAL

限制系统的:
TextField.PASSWORD
TextField.UNEDITABLE
TextField.SENSITIVE
TextField.NON_PREDICTIVE
TextField.INITIAL_CAPS_WORD
TextField.INITIAL_CASP_SENTENCE
TextField.CONSTRAINT_MASK 用来和TextBox 的getConstraints()函数所返回的结果做AND(&)逻辑运算,就可以取得目前的限制设置值。(请

不要在TextBox建立十使用此常量。)
getConstraints()/setConstraints()设定和取出限制类型。


AlertType
是工具类,本身不能实例化。它提供了几个定义好的AlertYtpe以辅助Alert类使用。
包括:
ALARM 警报
CONFIRMATION 确定
ERROR 错误
INFO 提供信息
WARNING 警告
警告音:
Display display;
AlertType.ALARM.playSound(display);
AlertType.CONFIRMATION.playSound(display);
AlertType.ERROR.playSound(display);
AlertType.INFO.playSound(display);
AlertType.WARNING.playSound(display);

Alert
  利用Display的setCurrent()将它设为目前显示在屏幕上的画面时,它会先发出一段声音,然后将自己显示在屏幕上,
过一段时间后,自动跳回之前的页面。
  如果Alert作为第一个显示在屏幕上的画面,必须利用setCommandListener()设定事件处理,不然会发生错误信息。
构造函数:
带一个参数的-指定标题即可
带四个参数的-标题,内含文字,影像,类型。
setType()/gerType()
setString()/getString()
setImage()/getImage()
是对上述参数的操作函数。
可以利用setTimeout()函数,传入Alert.FOREVER作为参数,来阻止Alert过一段时间就自动跳回原处的特性。这是必须由用户手动处理。
我们可以利用addCommand()添加系统菜单项,如果Alert本身没有加入任何Command的话,它的静态成员DISMISS_COMMAND会作为唯一的系统菜单

项。一旦我们加入自己的Command,DISMISS_COMMAND就不会出现。removeCommand()删除所有Alert中的Command后,DISMISS_COMMAND会再次出

现,以确保ALert上至少有一个选项可用。
setCommandListener()用于注册Alert事件。没有任何事件的话,一点按下都回到上一页。


LCDAUI高级API之Form与Item 
Form是一个容器类型,在Form上加入各式各样的Item子类,就形成了丰富的画面。

Form等校线:
靠左(Item.LAYOUT_LEFT)
靠中(Item.LAYOUT_CENTER)
靠右(Item.LAYOUT_RIGHT)
setLayout()设定/getLayout获取

每个Item都会有个Label属性,设为null代表不要Label。getLabel()/setLabel()
Item的实际显示大小:
最小尺寸(Minimum size):该组件运作时至少需要的尺寸 setMinimumHeight()/getMinimumWidth() 
期望尺寸(Preferred size):该组件运作时的最佳尺寸 setPreferredSize()/getPreferredSize()
setPreferredSize(50,-1)宽度锁定为50
setPreferredSize(-1,5)高度锁定为5

Item类型
StringItem
ImageItem
ChoiceGroup
TextField
Gauge
DateField

StringItem
用按钮或超级链接显示的一串字
Display display;
Form f=new Form("StringItem test");
StringItem si1=new StringItem("test1:","content1",Item.PLAIN);
f.append(si1); //insert()//delete()//set()
dislplay.setCurrent(f);

构造函数:
三个参数的:Label,content,style-可选择:PLAIN,BUTTON,HYPERLINK
两个参数的:等同于使用PLAIN型的外观。
getAppearanceMode()用于取得StringItem的外观。
getFont()/setFont()用来取得/设定字型。
getText()/setText()用来取得/设定内容

ItemCommandListener(Item与Command)
Item子类至少会有三种东西:
Command数组;
DefaultCommand变量,引用到Command数组中的一个Command;
指向ItemCommandListener的引用。

增删Command数组必须依靠addCommand()/removeCommand()
设定ItemCommandIListener的引用要使用setItemCommandListener()
设定DefaultCommand须使用setDefaultCommand()。

当我们将Item加入Form后,所选的Item内部的Command数组就会变成系统菜单项。
任何菜单项被选定后,实现了ItemCommandListener接口的类中的commandAction()方法就会被调用。

si.addCommand(new Command("1",Command.ITEM,1));
si.addCommand(new Command("2",Command.ITEM,1));
si.setItemCommandListener(this);
……

public void commandAction(Command c,Item i)
{
System.out.println(c.getLabel());
System.out.println(i.getLabel());
}

ImageItem
构造函数:
五参数:Label,影像,等校线,取代文字,外观-PLAIN,BUTTON,HYPERLINK。
四参数:等同外观为PLAIN。
 new Image()==  (new ImageItem(null,Image对象,ImageItem.LAYOUT_DEFAULT,null)

等校线:
ImageItem.LAYOUT_DEFAULT
ImageItem.LAYOUT_LEFT
ImageItem.LAYOUT_RIGHT
ImageItem.LAYOUT_CENTER
ImageItem.LAYOUT_NEWLINE_BEFORE
ImageItem.LAYOUT_NEWLINE_AFTER
setLayout()/getLayout()设定/取得等校线
setImage()/getImage()设定/取得Image对象
setAltText()/getAltText()设定/取得取代文字
getAppearanceMode()取得外观。

Spacer 
专门用来在Formshang加空白间隔的。
Display display;
StringItem si=new StringItem("test","content",Item.PLAIN);
f.append(si);
f.append(new Sacer(50,50));
display.setCurrent(f);

ChoiceGroup
和List类很相似,他们都实现了Choice接口。所不同的是,ChoiceGroup必须依附在Form中才有用。它只有
Choice.EXCLUSIVE Choice.MULTIPLE Choice.POPUP三种类型,不能使用Choice.IMPLICIT。

TextField
类似TextBox类。

Gauge
标尺,进度条。
构造函数:
卷标名,是否可以交互,允许的最大值,初始值

getMaxValue()/setMaxValue()取得/设定最大值
getValue()/setValue()取得/设定当时的初始值
isInteractive()判断是否可以交互
是否可以交互为false时,只能用setValue()设定值
是否可以交互=false并且允许的最大值=Gauge.INDEFINITE可以产生一个没有范围的Gauge.
初始值选择:
Gauge.CONTINUOUS_IDLE
Gauge.CONTINUOUS_RUNNING
Gauge.INCREMENTAL_IDLE
Gauge.INCREMENTAL_UPDATING

Gauge作为进度显示条:
Alert al=new ALert("processing");
……
Gauge g=new Gauge(null,false,10,0);
al.setIndicator(g);
……

DateField
日期时间组件
构造函数:
卷标,输入模式(--DateField.DATE/DateField.TIME/DateField.DATE_TIME),jva.util.TimeZone对象

getInputMode()/setInputMode()来取得/改变输入模式
getDate()/setDate()取得/设定用户所指定的时间

Date对象须和java.util.Calendar类配合才能发挥效用。


当放置于Form组件内部的用户接口组件内部状态改变时,Form组件会对

所有经由setItemStateListener()向它注册的类中的itemStateChanged()方法 发出状态改变的消息。ItemStateListener只在用户交互中组件

状态真的被改变时,其itemStateChanged()方法才被调用。
如果想自动调用itemStateChanged()需要这样:在某个组件状态改变后,调用Item的notifyStateChanged(),
程序就能自行调用itemStateChanged(),并立刻返回到原调用点。而无须等待itemStateChanged()结束才返回。

如若Form中同时有CommandListener和ItemStateListener时,itemStateCHanged()比commandAction()先被调用。


Canvas帮助我们处理低级系统事件。

重绘事件
一个是用低级API的系统至少要具有描绘画面的能力。

startApp(){
MyCanvas mc=new MyCanvas();
display.setCurrent(mc);
}

public class MyCanvas extends Canvas
{
  public void paint(Graphics g){
  { //code of paint.
  }
}
serviceRepaints()用来强制队列中的重绘事件快点做完。

坐标系
迪卡尔坐标系的Y轴方向向下就是我们屏幕上的坐标系。

坐标
是指像素(Pixel)和像素之间的空格所构成的坐标。

Graphics--画布
setColor(R,G,B) --value0~255
getRedComponent()
getGreenComponent()
getBuleComponent()

setColor(0x00RRGGBB) / getDisplayColor();

线 drawLine(start X,start Y,end X,end Y)

笔触(stroke style)--Graphics.SOLID 、Graphics.DOTTED
setStrokeStyle(Graphics.SOLID )

矩形 drawRect(start X,start Y,width,height)

圆角矩形 drawRoundRect(start X,start Y,width,height,arcWidth,arcHeight)
后两个参数:圆角所在矩形的宽和高。

弧形 drawArc(start X,start Y,width,height,arc,over)
前四个参数决定弧形所在的矩形范围,第五个决定起始角度,第六个决定弧形本身所涵盖的角度。

填充矩形 fillRect(start X,start Y,width,height)

填充圆角矩形 fillRoundRect(start X,start Y,width,height,arcWidth,arcHeight)

填充三角形 fillTriangle(x1,y1,x2,y2,x3,y3)

填充弧形  fillArc(start X,start Y,width,height,arc,over)

Canvas与屏幕事件处理
Canvas本身有两种状态:
普通状态-Normal 全屏状态-Full Screen
setFullScreenMode()来设定其状态。

当屏幕被系统画面覆盖时,自动调用hideNotify()
当系统画面消失时,恢复了原本的画面,系统会调用showNotify()

键盘事件处理
按下按钮引发keyPressed() 函数,传入一个代表该键的整数值
放开按钮引发keyReleased()函数,传入一个代表该键的整数值
连按按钮引发KeyRepeated()函数,传入一个代表该键的整数值;
不是所有机器都支持,hasRepeatEvents()来询问系统是否支持连发事件。

键盘响应
Canvas类里定义的常数:KEY_NUM0~KEY_NUM9、KEY_STAR,KEY_POUND分别代表0~9数字键和星井键。
另外定义了几个与Game键盘代码相关的常数:UP,DOWN,LEFT,RIGHT,FIRE,GAME_A,GAME_B,GAME_C,GAME_D

getGameAction()
该函数传入keyCode,函数会回传所代表的Game键盘代码
switch(getGameAction(keyCode))
{
     case Canvas.LEFT:
           moveLeft();
           break;

getKeyCode()
该函数传入Game键盘代码,函数会回传所代表的keyCode。 和上个函数互为反函数。
if (keyCode==getKeyCode(Canvas.LEFT))
moveLeft();

触摸屏事件
用hasPointerEvents()判断是否支持触摸屏事件。
触控笔点击 引发pointerPressed(),传入xy坐标
放开引发pointerReleased(),传入xy坐标。
拖拽 pointerDragged() (某些机器可以,用hasPointerMotionEvents()判断)


LCDAUI低级API之绘图  Display类
震动:display.vibrate(500);
背光:display.flashBacklight(500);
Display.isColor()--判断是否为彩屏
Display.numColors()--支持多少色彩
Display.numAlphaLevels()--支持透明层的数目
Display.getBestImageHeight(x)/Display.getBestImageWidth(x)--获得图像的高宽
x:只能是Display.ALERT,Display.LIST_ELEMENT,Display.CHOICE_GROUP_ELEMENT
Display.getBorderStyle()--
传入false时,返回描绘边线时所用的笔触,结果只有可能是Graphics.SOLID或Graphics.DOTTED两种
传入true时,返回的是描绘高亮度边线时所用的笔触。
display.getColor(x)--获得系统颜色
Display.COLOR_BACKGROUND--系统背景色
Display.COLOR_BORDER--系统边线色
Display.COLOR_FOREGROUND--系统前景色
Display.COLOR_HIGHLIGHTED_BACKGROUN--高亮度系统背景色
Display.COLOR_HIGHLIGHTED_BORDER--高亮度系统边线色
Display.COLOR_HIGHLIGHTED_FOREGEROUND--高亮度前景色
Graphics进阶
撕裂现象-tearing 当装置绘图的速度慢到某一个程度时,会产生装置之画到一半,而程序已变更了影响内存的内容,导致屏幕上出现一半是旧

的内存内容,一般是新的内存内容。

双缓冲区-Double Buffer 在供用户看到的Image之外,处理一个称为Off-Screen的Image,然后由paint()传入的Graphics对象的drawImage()绘

出。
用Canvas的isDoubleBuffered()判断是否支持Double Buffer技术。
绘制图片
drawImage(0
drawRegion()
drawRGB()
绘制字符串
drawString()
drawSubstring()
绘制文字
drawChar()
drawChars()
锚点
代表绘制图形跟字符串时,所制定的X,Y作标志的是何种意义。
7种定义:
Graphics.TOP
Graphics.BOTTOM
Graphics.LEFT
Graphics.RIGHT
Graphics.HCENTER
Graphics.VCENTER
Graphics.BASELINE
Font类
getDefaultFont() 取得代表系统缺省使用的字体对象。

getFont(face,style,size) 取得特定字体对象
各参数选项:
尺寸:
Font.SIZE_SMALL
Font.SIZE_MEDIUM
Font.SIZE_LARGE
外观:
Font.FACE_MONOSPACE
Font.FACE_PROPORTIONAL
Font.FACE_SYSTEM
样式:
Font.STYLE_BOLD
Font.STYLE_ITALIC
Font.STYLE_PLAIN
Font.STYLE_UNDERLINED

getFont()一个参数的,只有
FONT_INPUT_TEXT
DONT_STATIC_TEXT
两种可供选择

setFont()
getFace()
getStyle()
getSize()

isBold()
isItalic()
isPlain()
isUnderlined()
charWidth()
charsWidth()
stringWidth()
substringWidth()
getBaseLinePosition() 从字体最顶点到baseline的距离
getHeight()最顶点到最低点的距离


利用Thread解决paint()和用户输入响应同时将进行的问题。

 public class Mycanvas extends Canvas implements Runnable
 { int r=0;
  public Mycanvas()
  {
   Thread t=new Thread(this);
   t.start();
  }
  public void run()
  {
   while(true)
   {
    r++;
    if(r>10)
     r=0;
    repaint();
   }
  }
  public void paint(Graphics g)
  {
   clear(g);
   paintAnimation(g,100,10,r);
  }
  protected void keyPressed(int keycode)
  {
   switch(getGameAction(keycode))
   {
    case Canvas.UP:
     y=y-2;
     break;
    ……
   }
  }
 }

j2me已将stop()方法拿掉(j2se也不再提倡使用),我们利用标识(flag)来解决线程结束的问题
 boolean conti=false;
 ……
 if(cmd.equals("停止"))
 {
  conti=false;
  removeCommand(stop);
  addCommand(start);
 }else if(cmd.equals("开始"))
 {
  removeCommand(start);
  addCommand(stop);
  conti=true;
  Thread t=new Thread(this);
  t.start();
 }
 ……
 public void run()
 {
  while(conti)
  {
   r++;
   if(r>10)
    r=0;
   repaint();
  }
 }

时间控制
不同机器处理速度不同,为了保持游戏,画面的一致性,通过时间控制流程来解决
……
 int rate=50(50毫秒=1/20秒 画面重绘一次)
 public void run()
 {
  long s1=0;
  long s2=0;
  long diff=0;
  while(conti)
  {
   s1=Systen.currentTimeMillis();
   repaint();
   serviceRepaints();
   s2=Systen.currentTimeMillis();
   diff=s2-s1;
   System.out.rpintln(diff);
   if(diff<rate)
   {
    try
    {
     Thread.sleep(rate-diff);
    }catch(Exception exc){}
   }
   repaint();
  }
 }

--------------
JDBC针对桌面平台或企业用户设计,不适合移动通讯设备。

MIDP为的永久性数据储存提供了面向纪录的数据库(Record Orieted Database),称作“记录管理系统”
Record Management System(RMS)

所有和记录管理系统相关的类放于javax.microedition.rms包中,包括:
一个类:
RecordStore
四个接口:
RecorComparator
RecordEnumeration
RecordFilter
RecorListener
五个异常:
InvalidRecordIDException
RecordStoreException
RecordStoreFullException
RecordStoreNotFoundException
RecordStoreNotOpenException

一般的数据库管理系统存放表格(Table),
记录管理系统中存放记录仓储(Record Store)。

记录仓储全名(最多32个Unicode字符,区分大小写):
MIDlet Suite名称+供货商名称+记录仓储名称
实际设备上,一个MIDlet Suite全名:
MIDlet Suite名称+供货商名称+版本号码
即 MIDlet Suite-Name+MIDlet-Vendor+MIDlet-Version

如果把记录仓储想象成表格,那么这个表格只有两个字段(Column)
一个是Record ID,一个是Data

RecordStore类代表独一无二的记录仓储。我们用RecordStore类提供的openRecordStore()开启记录仓储,
这是一种静态工厂方法的设计模式。而不能通过new来建立一个RecordStore对象。

openRecordStore()构造函数
4参数:
记录仓储名称
布尔值,true表示开启的记录不存在是让系统建立一个新的数据仓储 false不存在时抛出RecordStoreNotFOundExecption异常
认证模式,接受:Record.AUTHMODE_PRIVATE--只有建立此记录仓储的MIDlet Suite才能存取这个记录仓储,
Record.AUTHMODE_ANY--该设备上的任何MIDlet都可以使用读取记录仓储。
布尔值,该设备上的其它MIDlet是否能够写入数据到这个记录仓储。
其它的MIDlet对记录仓储的读取:第三个参数决定读取权,第四个参数决定写入权

如果开启时,内存不敷使用,抛出RecordStoreFullException

3参数:
记录仓储名称
MIDlet Suite供货商名称
认证模式,Record.AUTHMODE_PRIVATE--建立记录仓储的MIDlet和当前调用它的MIDlet必须同属一个MIDlet Suite,
否则抛出SecurityException;Record.AUTHMODE_ANY--任何MIDlet都可以调用此方法。

2参数:
记录仓储名称
布尔值,true表示开启的记录不存在是让系统建立一个新的数据仓储 false不存在时抛出RecordStoreNotFOundExecption异常

setMode()方法来改变认证模式,以及其它MIDlet Suite中MIDlet的写入权
listRecordStores()取得当前MIDlet所在的MIDlet Suite中所有的记录仓储的名称

使用完记录仓储后,须用closeRecordStore()闭记录仓储,以释放系统资源,
所有RecordListener被清空,相关的RecordEnumeration。
如果已关闭,抛出RecordStroeNotOpenException。

deleteRecordStore()删除记录仓储。如果这个记录仓储正被占用,抛出RecordStoreNotFoundException

记录仓储的相关信息:
名字:记录仓储的名字
时间戳记-long类型:最后变动的时间(System.currentTimeMills()取得)
版本号码:初始为0,每更改一次加1
Next Record ID:初始为1,每加入一笔新记录加1

getLastModified()取得时间戳记
getName()取得记录仓储的名称
getNextRecordID()取得Next Record ID的值
getNumRecords()取得记录仓储中记录的笔数
getSize()取得记录仓储中所占据的空间
getSizeAvailable()剩下多上空间
getVersion()取得记录仓储版本号码

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页