对我来说算是挑战性的一个J2ME数据存储的问题,高手请进!

老猫的TOM 老猫的TOM 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一直在做J2EE的开发,最近公司拉了一个J2ME手持机<PDA>(其实和手机差不多)开发项目,本人算是第一次做这样的项目,如果问题问的有些弱还希望高手不要见笑。
下面开始说问题:
PAD使用的是WTK平台,要实现的功能是:对数据进行保存、修改、删除、查询,由于环境的问题,程序要求在无网络的情况下能够正常运行,所以运行环境算是单机版的。
数据格式很简单包含:档案ID、卡号、用户名、金额。
数据量最少在一万条以上,由于只能存储在本机环境内,这对于手持机来说不是件容易的事情。起先准备使用操作本地文本文件的方式存储(txt文件,每一行为一条数据)但是j2me对文本文件的操作真是太低级。对于查询和修改数据不易操作,而且数据过大会导致内存溢出。
所以本人准备尝试使用嵌入式数据库来完成,目前选用的数据库位JMESQL,网上对于这个数据库的操作知识并不是很多,只能在官方找到所谓的例子,可是操作中创建表一直不成功。后台打印异常为:
开始创建表----
..............false
开始创建表----
br.com.dreamsource.mobile.jmesql.exceptions.SQLException: already exists: PRICETABLE -- S0001 in statement [CREATE TABLE priceTable ( id int identity, name varchar(20) not null, percent float not null, primary key(id))] -- Table
at br.com.dreamsource.mobile.jmesql.jdbcResultSet.<init>(+37)
at br.com.dreamsource.mobile.jmesql.jdbcConnection.executeStandalone(+19)
at br.com.dreamsource.mobile.jmesql.jdbcConnection.execute(+21)
at br.com.dreamsource.mobile.jmesql.jdbcStatement.fetchResult(+36)
at br.com.dreamsource.mobile.jmesql.jdbcStatement.execute(+5)
at com.sqlplus.FrameMainMIDlet.createDatabase(+48)
at com.sqlplus.FrameMainMIDlet.commandAction(+33)
at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68)
at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent(+186)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+57)

看字面意思是提示数据表已存在,但是我明明是第一次创建。
附上源码希望高手能帮忙看看:


package com.sqlplus;

import java.util.Vector;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

import br.com.dreamsource.mobile.jmesql.jdbcConnection;
import br.com.dreamsource.mobile.jmesql.jdbcDriver;
import br.com.dreamsource.mobile.jmesql.jdbcPreparedStatement;
import br.com.dreamsource.mobile.jmesql.jdbcResultSet;
import br.com.dreamsource.mobile.jmesql.jdbcStatement;
import br.com.dreamsource.mobile.jmesql.exceptions.SQLException;


public class FrameMainMIDlet extends MIDlet implements CommandListener {

private Form mainForm;


private static DatabaseManager myDatabaseManager;
private UserPOJO userPOJO;

TextField tf = new TextField("要写入的数据", "", 100, TextField.ANY);

TextField cx = new TextField("查询条件", "", 100, TextField.ANY);

TextField cxjg = new TextField("查询结果", "", 100, TextField.ANY);

Command a_cmdSet = new Command("添加", Command.SCREEN, 0);

Command w_cmdSet = new Command("修改", Command.SCREEN, 0);

Command r_cmdSet = new Command("查询", Command.SCREEN, 0);

Command c_cmdSet = new Command("创建表", Command.SCREEN, 0);

Command exitCommand = new Command("退出", Command.EXIT, 0);

public FrameMainMIDlet() {

mainForm = new Form("嵌入式数据库");
mainForm.append(tf);
mainForm.append(cx);
mainForm.append(cxjg);
mainForm.addCommand(exitCommand);
mainForm.addCommand(c_cmdSet);
mainForm.addCommand(r_cmdSet);
mainForm.addCommand(w_cmdSet);
mainForm.addCommand(a_cmdSet);
mainForm.setCommandListener(this);

}

/* *//**
* 检查数据库如果没有开始创建
*
* @return
* @throws Exception
*/

public void createDatabase(UserPOJO userPOJO) {
jdbcDriver driver = new jdbcDriver();

// String userName = userPOJO.getUserName();
// String userPassword = userPOJO.getPasswd();

userPOJO.setUserName("SA");
userPOJO.setPasswd("");
userPOJO.setDbName(Consts.DATABASE_NAME);

jdbcConnection connection;
try {
connection = driver.connect(userPOJO.getAsProperties());
jdbcStatement statement = connection.createStatement();
boolean l=statement.execute(Consts.CREATE_PRICETABLE_TBL);
System.out.println(".............."+l);
if(l==true){

tf.setString("创建表成功.........");

boolean k=statement.execute("insert into priceTable values (null, 'tabela1', 10)");
if(k==true){

cx.setString("插入数据成功.......");

try {

jdbcPreparedStatement prepared =connection.prepareStatement("select name from priceTable");
jdbcResultSet res = prepared.executeQuery();

int i;
StringBuffer Results = new StringBuffer();
this.cxjg.setString("");
System.out.println("数据查询"+Results);
if (!(res == null)) {
while (res.next()) {
for (i = 1; i <= res.getColumnCount(); i++) {
this.cxjg.setString(this.cxjg.getString()
+ res.getColumnName(i) + " -- "
+ res.getString(i) + "\n");
}
this.cxjg.setString(this.cxjg.getString());
}
}
} catch (Exception e) {
this.cxjg.setString(e.getMessage());
}
}else{

cx.setString("插入数据失败.......");

}


}else{

tf.setString("创建表失败.....");

}
// boolean i=statement.execute(Consts.CREATE_CUSTOMER_TBL);


} catch (SQLException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO 自动生成方法存根

}

protected void pauseApp() {
// TODO 自动生成方法存根

}

protected void startApp() throws MIDletStateChangeException {
// TODO 自动生成方法存根



this.userPOJO = new UserPOJO();
this.userPOJO.setConnectionURL(Consts.DATABASE_CONNETION_STRING);
this.userPOJO.setDbName(Consts.DATABASE_NAME);
if (DatabaseManager.databaseExists(Consts.DATABASE_NAME)) {
Display.getDisplay(this).setCurrent(mainForm);
} else {
Display.getDisplay(this).setCurrent(mainForm);
}

}

public void commandAction(Command command, Displayable displayable) {
if (command == r_cmdSet) {





}else if(command==c_cmdSet){
System.out.println("开始创建表----");
try {
createDatabase( userPOJO);
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

}

}

}


package com.sqlplus;

import br.com.dreamsource.mobile.jmesql.io.Properties;

public class UserPOJO {


private String userName;
private String passwd;
private String dbName;
private String connectionURL;

public UserPOJO() {
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getPasswd() {
return passwd;
}

public void setPasswd(String passwd) {
this.passwd = passwd;
}

public String getDbName() {
return dbName;
}

public void setDbName(String dbName) {
this.dbName = dbName;
}

public String getConnectionURL() {
return connectionURL;
}

public void setConnectionURL(String connectionURL) {
this.connectionURL = connectionURL;
}

public Properties getAsProperties() {
Properties p = new Properties();
p.setProperty("user", this.userName);
p.setProperty("password", this.passwd);
p.setProperty("database", this.dbName);
return p;
}

}
...全文

相关推荐

j2me 经典版

java 中文教程 pdf

whh8vc

J2ME手机游戏开发全流程

本文还有配套的精品资源,点击获取 简介:本教程提供J2ME手机游戏开发的基础知识,介绍J2ME架构、开发环境设置、MIDP API使用、游戏编程基础、图形音频处理、数据存储、网络功能、性能优化、测试调试以及发布部署。内容涵盖了从入门到实践的各个步骤,适合初学者掌握J2ME手机游戏开发的核心技能。尽管现代移动平台更倾向于使用更先进的开发工具和语言,J2ME作为学习平台仍具有重...

KX-EZ

J2ME开发基础全接触:从入门到精通

本文还有配套的精品资源,点击获取 简介:Java 2 Micro Edition (J2ME) 是Java平台的一个子集,专为嵌入式系统和移动设备等物联网应用设计。本教程全面覆盖J2ME开发的基础知识,包括架构、开发环境、核心组件、用户界面、数据存储、网络编程、设备特性和性能优化等关键内容。开发者将学习如何利用MIDP和CLDC等技术,创建具有丰富功能的移动应用程序。本教程...

不教书的塞涅卡

深入理解J2ME API文档与实战指南

本文还有配套的精品资源,点击获取 简介:Java 2 Micro Edition(J2ME)是用于开发资源有限设备应用程序的Java技术分支,重点是效率和可移植性。J2ME API文档作为开发者的宝贵资源,详述了各种类库、接口和方法。文章将详细介绍J2ME的结构,核心API如CLDC、MIDP、KVM、用户界面、网络编程、数据存储以及Java ME生命周期管理,并提供学习与...

你好像一条狗啊

j2me入门教程j2me入门教程j2me入门教程

j2me入门教程j2me入门教程j2me入门教程j2me入门教程j2me入门教程

zhang1230523
评论 8
收藏 已收藏
分享
返回顶部
老猫的TOM
J2ME 13,096 成员 26,491 内容