📄 dbtool.java
字号:
package org.zblog.zenghelper.dbtool;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import org.zblog.zenghelper.screen.*;
import org.zblog.zenghelper.util.*;
import java.util.Vector;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;
/**
* <br><strong>Z英语学习助手-RMS操作工具类</strong><br>
* <br>该主要包括以下功能:
* <br>1.定义了几个RMS静态常量名
* <br>2.简单的RMS操作:打开RMS,添加记录,删除记录,获取记录,更新记录
* <br>3.高级的RMS操作:添加word,更新word,删除word,获取生词id集合
*
* @author <a href="mailto:zcw@zblog.org">朱传伟</a><br>
* <a href="http://www.zblog.org">www.zblog.org</a></p>
* @version <strong>ZEnHelper</strong> Ver 1.0
*/
public class DbTool implements Runnable{
public static final String CN_WORD_GROUP_DB="cnwordgroup";
public static final String EN_WORD_GROUP_DB="enwordgroup";
public static final String STRANGE_WORD="strangeword";
public static final String CN_WORD_DB="cnworddb";
public static final String EN_WORD_DB="enworddb";
public static final String SYSTEM_DB="systemdb";
//第一条记录的id编号
public static int cnFirstId=0;
public static int enFirstId=0;
private static DbTool dbt=null;
/**
* 初始化cnFirstId,enFirstId;
*/
private DbTool() {
DBInit();
}
/**
* 检查数据库是否已初始化
*/
public void DBInit(){
try{
cnFirstId=getNextId(false)-1000;
enFirstId=getNextId(true)-676;
if(cnFirstId<0||enFirstId<0){
PublicRes pr=PublicRes.getInstance();
Alert al=new Alert("程序初始化"," 程序第一次运行.\n 需要初始化数据库.\n 请稍后.....",pr.busyImage,AlertType.CONFIRMATION);
al.setTimeout(60000000);
Navigator.show(al);
Thread init=new Thread(this);
init.start();
}
}
catch(Exception e){e.printStackTrace();}
}
/**
* 返回DbTool对象
* @return DbTool
*/
public synchronized static DbTool getInstance(){
if(dbt==null)
dbt=new DbTool();
return dbt;
}
/**
* 打开RecordStroe,返回RecordStore对象
* @param rsName String
* @return RecordStore
*/
public RecordStore openRS(String rsName){
try{
return RecordStore.openRecordStore(rsName,true);
}
catch(Exception e){
return null;
}
}
/**
* 直接返回指定RMS下的指定id的byte[]
* @param rsName String
* @param id int
* @return byte[]
*/
public byte[] getRSByte(String rsName,int id){
byte[] tby=null;
try{
RecordStore rs = openRS(rsName);
tby = rs.getRecord(id);
rs.closeRecordStore();
}
catch(Exception e){
e.printStackTrace();
}
return tby;
}
/**
* 更新指定仓库rsName中rid的数据
* @param rsName String 仓库名
* @param bts byte[] 待更新的数据
* @param rid int 记录编号
* @return boolean
*/
public boolean update(String rsName,byte[] bts,int rid){
try{
RecordStore rs = openRS(rsName);
rs.setRecord(rid,bts,0,bts.length);
rs.closeRecordStore();
return true;
}
catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* 往指定的rsName仓库中插入一条记录,该方法不适合批量插入
* @param rsName String 仓库名
* @param bts byte[] 记录数据
* @return int 返回记录id
*/
public int addOne(String rsName,byte[]bts){
try{
RecordStore rs = openRS(rsName);
int id=rs.addRecord(bts,0,bts.length);
rs.closeRecordStore();
return id;
}
catch(Exception e){
e.printStackTrace();
return -1;
}
}
/**
* 专门针对添加单词而封装的数据库操作.
* <br>对AddWordScreen中数据的检查在AddWordScreen中实现;
* <br>需要检查:enWord(必须),对于中文解释,属性可选,但中文词必须有.
* @param aws AddWordScreen
* @return 添加或更新的En库的Id编号,-1表示出错
*/
public int addWord(AddWordScreen aws){
try{
//1.首先获取EnWord对象,如果该En词不存在,则:先添加该单词,以及添加到EnGroup
WordGroup enGroup=new WordGroup(aws.enWord,true);
EnWord ew=new EnWord(aws.enWord,enGroup);
ew.setYbs(aws.ybs);
if(ew.rsId==-1){
ew.toBytes();
ew.rsId=addOne(EN_WORD_DB,ew.bytes);
enGroup.addWord(ew.word,ew.rsId);
enGroup.store();
}
//判断是否需要添加为生词
if(aws.sen){
ByteArrayOutputStream bos=new ByteArrayOutputStream();
DataOutputStream dos=new DataOutputStream(bos);
dos.writeInt(ew.rsId);
byte[]bts=bos.toByteArray();
dos.close();
bos.close();
int sid=addOne(STRANGE_WORD,bts);
ew.setSen(sid);
}
//2.获取EnWord关联的CnWord,并且设置RsId到enword中
Vector cns=aws.cnWords;
String ts=null;
String temp=null;
WordGroup cnWg=null;
CnWord cword=null;
//CnWord dd=new CnWord("sss",enGroup);
for(int i=0;i<cns.size();i++){
ts=(String)cns.elementAt(i);
temp=ts.substring(ts.indexOf(".")+1);
cnWg=new WordGroup(temp,false);
cword=new CnWord(temp,cnWg);
cword.addEnId(ew.rsId+"");
cword.toBytes();
//如果该Cn词不存在,则:1.添加该Cn词到CnDB库 2.将该Cn词添加到CnGroup库
if(cword.rsId==-1){
cword.rsId=addOne(CN_WORD_DB,cword.bytes);
cnWg.addWord(temp,cword.rsId);
cnWg.store();
}
//如果存在,则:1. 更新Cn词
else{
update(CN_WORD_DB,cword.bytes,cword.rsId);
}
//将该Cn RsId添加到EnWord中
ew.addCnId(cword.rsId+"",ts.substring(0,ts.indexOf(".")));
}
//3.更新EnWord对象
ew.store();
return ew.rsId;
}
catch(Exception e){
e.printStackTrace();
return -1;
}
}
/**
* 更新Word,需要以下操作:<br>
* <br>1.根据rsId,需要删除原有的所有关联:清除CnDB中的所有关联,删除EnDB中的记录
* <br>2.根据groupId删除EnGroup中的记录
* <br>3.删除生词表中的记录
* <br>4.从新执行添加操作,调用上面的添加方法
* @param as AddWordScreen
*/
public int updateWord(AddWordScreen as){
try{
//根据rsId,需要删除原有的所有关联:清除CnDB中的所有关联,删除EnDB中的记录
EnWord ew = new EnWord(as.rsId);
Vector tcns = ew.cnRSId;
for (int i = 0; i < tcns.size(); i++) {
CnWord tcw = new CnWord(Integer.parseInt((String) tcns.
elementAt(i)));
tcw.enRSId.removeElement(("" + ew.rsId));
tcw.store();
}
WordGroup twg=new WordGroup(ew.word,true);
twg.words.remove(ew.word);
twg.store();
//根据ew中的senId,删除生词表中的id
if(ew.senId!=-1)
deleteOne(STRANGE_WORD,ew.senId);
//根据groupId删除EnGroup中的记录
deleteOne(EN_WORD_DB,ew.rsId);
//从新执行添加操作,调用上面的添加方法
return addWord(as);
}
catch(Exception e){
e.printStackTrace();
return -1;
}
}
/**
* 删除单个EnWord方法,该方法的执行过程如下:<br>
* 1.删除CnWord中关联<br>
* 2.删除EnGroup中的关联<br>
* 3.删除STRANGE_WORD中的关联<br>
* 4.删除EnWord本身
* @param rsId int 失败:-1,成功:正整数
*/
public int delEnWord(int rsId){
try{
//构建EnWord对象
EnWord ew=new EnWord(rsId);
//删除该EnWord与CnWord的关联
if(ew.cnRSId.size()>0){
Vector cns=ew.cnRSId;
CnWord cw=null;
for(int n=cns.size()-1;n>=0;n--){
cw=new CnWord(Integer.parseInt((String)cns.elementAt(n)));
cw.enRSId.removeElement(rsId+"");
cw.store();
}
}
//删除该EnWord与Strange的关联
if(ew.senId!=-1){
deleteOne(STRANGE_WORD,rsId);
}
//删除该EnWord与EnGroup的关联
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -