- 浏览: 205781 次
- 性别:
- 来自: 湖南
-
文章分类
最新评论
基础知识
持久化存储的必要性
J2ME中提供了记录管理系统:RMS,和数据库很类似
相关的包:javax.microedition.rms 最重要的类:RecordStore
注意:RMS是记录管理系统,类似数据库;RecordStore是记录集,类似表,表中有Record
RecordStore
常用打开记录集的方法
staticRecordStoreopenRecordStore(StringrecordStoreName,booleancreateIfNecessary)
参数1:记录集名称(区分大小写);参数2:如果不存在,是否创建
staticRecordStore openRecordStore(StringrecordStoreName,booleancreateIfNecessary,intauthmode,booleanwritable)
参数1:记录集名称;参数2:如果不存在,是否创建;参数3:创建方式(AUTHMODE_ANY/PRIVATE),表示是否可以被其他套件创建访问;参数4:其他
套件是否可以进行写操作
记录集占据的空间:int getSize()
得到记录集名称:StringgetName()
关闭记录集: closeRecordStore
列出当前的所有记录集:RecordStore.listRecordStores();
删除某个记录集:RecordStore.deleteRecordStore("name");
RecordStore记录操作
注意:每一个记录都有ID,第一个记录ID为1
添加记录: int addRecord(byte[] data,intoffset,int numBytes)
案例:将“张三”,”李四光”添加进RMS
得到当前记录条数:int getNumRecords()
根据ID获得记录: byte[]getRecord(int recordId)/int getRecord(int recordId, byte[] buffer,intoffset)
根据ID获得记录字节数:int getRecordSize(int recordId)
修改记录: voidsetRecord(int recordId, byte[]newData,intoffset,int numBytes)
删除记录:voiddeleteRecord(int recordId) :注意,删掉一条记录之后,虽然记录数量减少了,但是记录还是保存在原来的位置,以后添加,ID在
后面增加
将对象写入RMS
将对象转化为字节数组(序列化);
将字节数组转化为对象
高级知识
遍历记录集
不能根据记录数量来遍历,因为纪录被删除后,其他纪录并不会填充空缺,记录数量虽然减少,但是ID数量不变
方法1:enumerateRecords(RecordFilterfilter, RecordComparatorcomparator,booleankeepUpdated) ,参数1:过滤条件,参数2:比较规则,参数3:是
否和记录集保持更新
方法2:getNextRecordID:得到下一个将要添加的记录的ID,然后用for循环,并判断记录是否为空
记录监听
voidrecordAdded(RecordStore recordStore,int recordId) :记录添加时自动触发
voidrecordChanged(RecordStore recordStore,int recordId) :纪录修改时自动触发
voidrecordDeleted(RecordStore recordStore,int recordId) :记录删除时,自动触发
RecordStore addRecordListener(RecordListenerlistener) 负责绑定
数据过滤
RecordFilter接口
定义一个类,实现这个接口
重写match函数,根据情况返回true或者false
用枚举方法来遍历时,将类的对象传进去
数据排序
RecordComparator接口
定义一个类,实现这个接口
重写compare函数,根据情况返回:
RecordComparator.PRECEDES:记录1在记录2前面
RecordComparator.FOLLOWS:记录1在记录2后面
RecordComparator.EQUIVALENT:记录1=记录2
用枚举方法来遍历时,将类的对象传进去
问题
可以修改MF或者JAD文件中的MIDlet-Data-Size属性来改变RMS的最小存储字节数,首选JAD
文件路径在WTK上面在:用户名称\j2mewtk\2.5.2\appdb\temp.DefaultColorPhoneXX下面的db文件
一个记录集内的容量有限,约100K,如果数据太大,考虑用多个记录集
模拟电话本
界面出现,显示一个欢迎界面,右下角按钮:电话本;左下角按钮:退出
按电话本按钮,显示电话本界面,用List显示所有电话;界面上左下角:返回;右下角两个按钮:添加电话,删除电话。
按删除电话,删掉当前电话;按添加电话,进入添加电话界面,输入姓名和电话,确定,可以添加,添加完毕,进入电话本界面;该界面左下角的返回按钮供返回
持久化存储的必要性
J2ME中提供了记录管理系统:RMS,和数据库很类似
相关的包:javax.microedition.rms 最重要的类:RecordStore
注意:RMS是记录管理系统,类似数据库;RecordStore是记录集,类似表,表中有Record
RecordStore
常用打开记录集的方法
staticRecordStoreopenRecordStore(StringrecordStoreName,booleancreateIfNecessary)
参数1:记录集名称(区分大小写);参数2:如果不存在,是否创建
staticRecordStore openRecordStore(StringrecordStoreName,booleancreateIfNecessary,intauthmode,booleanwritable)
参数1:记录集名称;参数2:如果不存在,是否创建;参数3:创建方式(AUTHMODE_ANY/PRIVATE),表示是否可以被其他套件创建访问;参数4:其他
套件是否可以进行写操作
记录集占据的空间:int getSize()
得到记录集名称:StringgetName()
关闭记录集: closeRecordStore
列出当前的所有记录集:RecordStore.listRecordStores();
删除某个记录集:RecordStore.deleteRecordStore("name");
RecordStore记录操作
注意:每一个记录都有ID,第一个记录ID为1
添加记录: int addRecord(byte[] data,intoffset,int numBytes)
案例:将“张三”,”李四光”添加进RMS
得到当前记录条数:int getNumRecords()
根据ID获得记录: byte[]getRecord(int recordId)/int getRecord(int recordId, byte[] buffer,intoffset)
根据ID获得记录字节数:int getRecordSize(int recordId)
修改记录: voidsetRecord(int recordId, byte[]newData,intoffset,int numBytes)
删除记录:voiddeleteRecord(int recordId) :注意,删掉一条记录之后,虽然记录数量减少了,但是记录还是保存在原来的位置,以后添加,ID在
后面增加
将对象写入RMS
将对象转化为字节数组(序列化);
将字节数组转化为对象
高级知识
遍历记录集
不能根据记录数量来遍历,因为纪录被删除后,其他纪录并不会填充空缺,记录数量虽然减少,但是ID数量不变
方法1:enumerateRecords(RecordFilterfilter, RecordComparatorcomparator,booleankeepUpdated) ,参数1:过滤条件,参数2:比较规则,参数3:是
否和记录集保持更新
方法2:getNextRecordID:得到下一个将要添加的记录的ID,然后用for循环,并判断记录是否为空
记录监听
voidrecordAdded(RecordStore recordStore,int recordId) :记录添加时自动触发
voidrecordChanged(RecordStore recordStore,int recordId) :纪录修改时自动触发
voidrecordDeleted(RecordStore recordStore,int recordId) :记录删除时,自动触发
RecordStore addRecordListener(RecordListenerlistener) 负责绑定
数据过滤
RecordFilter接口
定义一个类,实现这个接口
重写match函数,根据情况返回true或者false
用枚举方法来遍历时,将类的对象传进去
数据排序
RecordComparator接口
定义一个类,实现这个接口
重写compare函数,根据情况返回:
RecordComparator.PRECEDES:记录1在记录2前面
RecordComparator.FOLLOWS:记录1在记录2后面
RecordComparator.EQUIVALENT:记录1=记录2
用枚举方法来遍历时,将类的对象传进去
问题
可以修改MF或者JAD文件中的MIDlet-Data-Size属性来改变RMS的最小存储字节数,首选JAD
文件路径在WTK上面在:用户名称\j2mewtk\2.5.2\appdb\temp.DefaultColorPhoneXX下面的db文件
一个记录集内的容量有限,约100K,如果数据太大,考虑用多个记录集
模拟电话本
界面出现,显示一个欢迎界面,右下角按钮:电话本;左下角按钮:退出
按电话本按钮,显示电话本界面,用List显示所有电话;界面上左下角:返回;右下角两个按钮:添加电话,删除电话。
按删除电话,删掉当前电话;按添加电话,进入添加电话界面,输入姓名和电话,确定,可以添加,添加完毕,进入电话本界面;该界面左下角的返回按钮供返回
package prj; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; //欢迎界面 public class WelcomeCanvas extends Canvas implements CommandListener{ private Command cmdPhone = new Command("电话本",Command.SCREEN,1); private Command cmdExit = new Command("退出",Command.EXIT,1); private PhoneMIDlet pm; public WelcomeCanvas(PhoneMIDlet pm){ this.pm = pm; this.addCommand(cmdPhone); this.addCommand(cmdExit); this.setCommandListener(this); } public void commandAction(Command c,Displayable d){ if(c==cmdPhone){ pm.changeInterface("PhoneList"); } else if(c==cmdExit){ pm.notifyDestroyed(); } } public void paint(Graphics g){ String str = "欢迎光临"; g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE)); g.setColor(255,0,0); g.drawString(str, this.getWidth()/2, 50, Graphics.TOP|Graphics.HCENTER); } }
package prj; import java.util.Vector; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStore; public class RMSOpe { private String storeName; private RecordStore rs; public RMSOpe(String storeName){ this.storeName = storeName; } public void openRecordStore(){//打开记录集 try{ rs = RecordStore.openRecordStore(storeName, true); }catch(Exception ex){ ex.printStackTrace(); } } public void addPhone(String name,String phone){//添加电话 String info = name + ":" + phone; byte[] b = info.getBytes(); try{ rs.addRecord(b, 0, b.length); }catch(Exception ex){ ex.printStackTrace(); } } public void deletePhone(String str){//删除电话 int lastId = 0; try{ lastId = rs.getNextRecordID(); }catch(Exception ex){ ex.printStackTrace(); } for(int i=1;i<lastId;i++){ try{ byte[] b = rs.getRecord(i); String recordStr = new String(b); if(recordStr.equals(str)){ rs.deleteRecord(i); } }catch(Exception ex){} } } public Vector getAllPhone(){//得到所有电话 Vector v = new Vector(); try{ RecordEnumeration re = rs.enumerateRecords(null,null,false); while(re.hasNextElement()){ v.addElement(new String(re.nextRecord())); } }catch(Exception ex){ ex.printStackTrace(); } return v; } public void closeRecordStore(){//关闭记录集 try{ rs.closeRecordStore(); }catch(Exception ex){} } }
package prj; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.TextField; public class AddForm extends Form implements CommandListener{ private Command cmdOK = new Command("确定添加",Command.SCREEN,1); private Command cmdBack = new Command("返回",Command.BACK,1); private TextField tfName = new TextField("请您输入姓名","",10,TextField.ANY); private TextField tfPhone = new TextField("请您输入电话","",10,TextField.PHONENUMBER); private PhoneMIDlet pm; public AddForm(PhoneMIDlet pm){ super("添加电话"); this.pm = pm; this.addCommand(cmdOK); this.addCommand(cmdBack); this.setCommandListener(this); this.append(tfName); this.append(tfPhone); } public void commandAction(Command c,Displayable d){ if(c==cmdOK){//添加电话,并回到电话本界面 //.....添加电话 this.addPhone(); pm.changeInterface("PhoneList"); } else if(c==cmdBack){//返回电话本界面 pm.changeInterface("PhoneList"); } } /*添加电话*/ public void addPhone(){ RMSOpe rmsope = new RMSOpe("PhoneStore"); rmsope.openRecordStore(); rmsope.addPhone(tfName.getString(), tfPhone.getString()); rmsope.closeRecordStore(); } }
package prj; import java.util.Vector; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.List; public class PhoneList extends List implements CommandListener{ private Command cmdBack = new Command("返回",Command.BACK,1); private Command cmdAdd = new Command("添加电话",Command.SCREEN,1); private Command cmdDel = new Command("删除电话",Command.SCREEN,1); private PhoneMIDlet pm; public PhoneList(PhoneMIDlet pm){ super("电话本",List.IMPLICIT); this.pm = pm; this.addCommand(cmdBack); this.addCommand(cmdAdd); this.addCommand(cmdDel); this.setCommandListener(this); } public void commandAction(Command c,Displayable d){ if(c==cmdBack){//返回欢迎界面 pm.changeInterface("WelcomeCanvas"); } else if(c==cmdAdd){ pm.changeInterface("AddForm"); } else if(c==cmdDel){ //删除纪录... this.delete(); pm.changeInterface("PhoneList");//更新 } } /*载入所有电话*/ public void loadPhones(){ RMSOpe rmsope = new RMSOpe("PhoneStore"); rmsope.openRecordStore(); Vector v = rmsope.getAllPhone(); for(int i=0;i<v.size();i++){ this.append((String)v.elementAt(i), null); } rmsope.closeRecordStore(); } /*删除电话*/ public void delete(){ RMSOpe rmsope = new RMSOpe("PhoneStore"); rmsope.openRecordStore(); rmsope.deletePhone(this.getString(this.getSelectedIndex())); rmsope.closeRecordStore(); } }
package prj; import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class PhoneMIDlet extends MIDlet { public Display dis; private WelcomeCanvas wc = new WelcomeCanvas(this); private PhoneList pl = new PhoneList(this); private AddForm af = new AddForm(this); protected void startApp() throws MIDletStateChangeException { dis = Display.getDisplay(this); this.changeInterface("WelcomeCanvas"); } public void changeInterface(String interfaceName){ if(interfaceName.equals("WelcomeCanvas")){ dis.setCurrent(wc); } else if(interfaceName.equals("PhoneList")){ dis.setCurrent(pl); pl.deleteAll(); pl.loadPhones();//更新 } else if(interfaceName.equals("AddForm")){ dis.setCurrent(af); } } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } }
- J2me源代码.rar (788.8 KB)
- 下载次数: 1
发表评论
-
J2ME代码优化
2011-01-17 10:09 924为什么要优化 CPU不快:10-400MHz 内存有限 ... -
GameAPI
2011-01-17 10:06 1700游戏画布,图层和游戏精灵 简介 javax.microed ... -
网络编程
2011-01-15 08:11 9911、Socket编程 Socket是什么 Socket是套接字 ... -
画布开发
2011-01-12 13:48 1214CanvasCanvas绘图 画布属于低级界面 Canva ... -
高级开发
2011-01-07 14:08 865高级开发 异常处理 异常的出现 程序运行时由于一些不可预知的 ... -
高级界面开发
2011-01-06 08:33 1022高级界面开发 1:基本界 ... -
体系介绍和环境配置
2010-12-20 14:16 819J2ME简介 Three Java Platforms ...
相关推荐
通过运用“煤矿安全生产风险管理系统(msrms)”,公司进一步提高了风险管理能力,实现了对潜在风险的实时监测和预警,有效预防了事故的发生。 此外,安全机制的推进也是2021年煤矿企业安全生产工作计划的重要组成...
c语言学习
人脸识别项目源码实战
人脸识别项目源码实战
本图书进销存管理系统管理员功能有个人中心,用户管理,图书类型管理,进货订单管理,商品退货管理,批销订单管理,图书信息管理,客户信息管理,供应商管理,库存分析管理,收入金额管理,应收金额管理,我的收藏管理。 用户功能有个人中心,图书类型管理,进货订单管理,商品退货管理,批销订单管理,图书信息管理,客户信息管理,供应商管理,库存分析管理,收入金额管理,应收金额管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得图书进销存管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高图书进销存管理系统管理效率。 关键词:图书进销存管理系统;Spring Boot框架;MYSQL数据库
基于动态规划和模型预测控制的并联混合电动汽车最佳控制 简介:利用动态规划,使用模型预测控制,实现对并联混合动力电动汽车的最佳控制,并降低总体成本函数 使用动态规划可以实现混合动力电动汽车的优化控制 混合动力电动汽车的模型预测控制是通过使用动态规划在缩短的时域内实现的 代码为纯matlab脚本,附带说明电子文档 ,并联混合电动汽车; 动态规划; 模型预测控制; 最佳控制; 总体成本函数; Matlab脚本。,动态规划与模型预测控制在并联混合动力电动汽车的最优控制策略
人脸识别项目实战
2025 DeepSeek技术全景解析-重塑全球AI生态的中国力量.pdf
能够爬取非会员视频和音频资源,可通过ffmpeg等工具将视频资源和音频资源合并
基于差分进化算法DE的机器人路径规划 本产品基于优化的差分进化算法,专为机器人山地路径规划而设计 通过模拟差分进化过程中的变异、交叉与选择机制,算法能够智能探索并确定最优行进路线,全面考量路径长度、能量消耗及地形适应性 优化之处在于融合了动态差分权重与精英保留策略,显著增强了算法的搜索效率和求解质量,有效规避了早熟收敛的风险 该算法在山地这一复杂且多变的自然环境中展现出卓越性能,完美适配于机器人探险、山地救援、环境监测等多种应用场景 我们矢志为用户提供卓越、稳健的机器人路径规划方案,推动各类山地作业迈向更为精确与高效的路径规划新时代 ,差分进化算法DE; 机器人路径规划; 山地路径规划; 算法优化; 早熟收敛风险规避; 山地探险应用场景; 环境监测场景。,DE算法赋能机器人,优化山地路径规划方案
情侣游戏情侣飞行棋10元真心话大冒险情侣情趣骰子php源码 ----- 程序特色 ----- 1、完整的分销制度,可自定义多种不同的返佣比例 2、支持情侣飞行棋、情趣骰子,多种等级 3、无感微信自动授权登录,支持微信第三方授权登录 4、完全开源无加密
HeidiSQL的12.2.0.6576安装压缩包
监护人,小孩和玩具数据集 4647张原始图片 监护人 食物 孩子 玩具 精确率可达85.4% yolov5pytorch格式
本课程是 PHP 进阶系列之 Swoole 入门精讲,系统讲解 Swoole 在 PHP 高性能开发中的应用,涵盖 协程、异步编程、WebSocket、TCP/UDP 通信、任务投递、定时器等核心功能。通过理论解析和实战案例相结合,帮助开发者掌握 Swoole 的基本使用方法及其在高并发场景下的应用。 适用人群: 适合 有一定 PHP 基础的开发者、希望提升后端性能优化能力的工程师,以及 对高并发、异步编程感兴趣的学习者。 能学到什么: 掌握 Swoole 基础——理解 Swoole 的核心概念,如协程、异步编程、事件驱动等。 高并发处理——学习如何使用 Swoole 构建高并发的 Web 服务器、TCP/UDP 服务器。 实战项目经验——通过案例实践,掌握 Swoole 在 WebSocket、消息队列、微服务等场景的应用。 阅读建议: 建议先掌握 PHP 基础,了解 HTTP 服务器和并发处理相关概念。学习过程中,结合 官方文档和实际项目 进行实践,加深理解,逐步提升 Swoole 开发能力。
机器人先进视觉赛-基于深度学习yolov8的3D识别项目源码含gui界面(最新发布).zip 实现机器人的3D目标识别和分割功能 支持深度图像的处理和分析 【资源详情说明】 【1】该项目为近期精心打造开发,完整代码。同时,配套资料一应俱全,涵盖详细的设计文档 【2】项目上传前源码经过严格测试,在多种环境下均能稳定运行,功能完善且稳定运行,技术研究、教学演示还是项目实践,都能轻松复现,节省时间和精力。 【3】本项目面向计算机相关专业领域的各类人群,对于高校学生,可作为毕业设计、课程设计、日常作业的优质参考;对于科研工作者和行业从业者,可作为项目初期立项演示,助力快速搭建原型,验证思路。 【4】若具备一定技术基础,可在此代码上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 【5】小白,在配置环境或运行项目时遇到困难,可提供远程指导和全方位技术支持。 欢迎下载学习本项目资源,期待与你共同探讨技术问题,交流项目经验!
Matlab实现TSO-XGBoost多变量回归预测 Matlab实现TSO-XGBoost多变量回归预测,金枪鱼算法优化XGBoost多变量回归预测 1.data为数据集,7个输入特征,1个输出特征 2.MainTSO XGboost.m为主程序文件,其他为函数文件,无需运行 3.命令窗口输出R2、MAE、MAE和RMSEP等评价指标,可在下载区获取数据和程序内容 注意程序和数据放在一个文件夹,文件夹不可以XGBoost命名,因为有函数已经用过,运行环境为 Matlab2018及以上,预测效果如下 ,TSO-XGBoost; 多变量回归预测; Matlab实现; 金枪鱼算法优化; 评价指标; 预测效果; 文件夹结构; 运行环境,Matlab中TSO-XGBoost多变量回归预测优化实践
实时音视频SRT协议中文完整版
学习WiFi,入手资料
c语言学习