?? dbtool.java~310~
字號(hào):
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英語(yǔ)學(xué)習(xí)助手-RMS操作工具類(lèi)</strong><br>
* <br>該主要包括以下功能:
* <br>1.定義了幾個(gè)RMS靜態(tài)常量名
* <br>2.簡(jiǎn)單的RMS操作:打開(kāi)RMS,添加記錄,刪除記錄,獲取記錄,更新記錄
* <br>3.高級(jí)的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編號(hào)
public static int cnFirstId=0;
public static int enFirstId=0;
private static DbTool dbt=null;
/**
* 初始化cnFirstId,enFirstId;
*/
private DbTool() {
DBInit();
}
/**
* 檢查數(shù)據(jù)庫(kù)是否已初始化
*/
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("程序初始化"," 程序第一次運(yùn)行.\n 需要初始化數(shù)據(jù)庫(kù).\n 請(qǐng)稍后.....",pr.busyImage,AlertType.CONFIRMATION);
al.setTimeout(60000000);
Navigator.show(al);
Thread init=new Thread(this);
init.start();
}
}
catch(Exception e){e.printStackTrace();}
}
/**
* 返回DbTool對(duì)象
* @return DbTool
*/
public synchronized static DbTool getInstance(){
if(dbt==null)
dbt=new DbTool();
return dbt;
}
/**
* 打開(kāi)RecordStroe,返回RecordStore對(duì)象
* @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;
}
/**
* 更新指定倉(cāng)庫(kù)rsName中rid的數(shù)據(jù)
* @param rsName String 倉(cāng)庫(kù)名
* @param bts byte[] 待更新的數(shù)據(jù)
* @param rid int 記錄編號(hào)
* @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倉(cāng)庫(kù)中插入一條記錄,該方法不適合批量插入
* @param rsName String 倉(cāng)庫(kù)名
* @param bts byte[] 記錄數(shù)據(jù)
* @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;
}
}
/**
* 專(zhuān)門(mén)針對(duì)添加單詞而封裝的數(shù)據(jù)庫(kù)操作.
* <br>對(duì)AddWordScreen中數(shù)據(jù)的檢查在AddWordScreen中實(shí)現(xiàn);
* <br>需要檢查:enWord(必須),對(duì)于中文解釋?zhuān)瑢傩钥蛇x,但中文詞必須有.
* @param aws AddWordScreen
* @return 添加或更新的En庫(kù)的Id編號(hào),-1表示出錯(cuò)
*/
public int addWord(AddWordScreen aws){
try{
//1.首先獲取EnWord對(duì)象,如果該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關(guān)聯(lián)的CnWord,并且設(shè)置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庫(kù) 2.將該Cn詞添加到CnGroup庫(kù)
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對(duì)象
ew.store();
return ew.rsId;
}
catch(Exception e){
e.printStackTrace();
return -1;
}
}
/**
* 更新Word,需要以下操作:<br>
* <br>1.根據(jù)rsId,需要?jiǎng)h除原有的所有關(guān)聯(lián):清除CnDB中的所有關(guān)聯(lián),刪除EnDB中的記錄
* <br>2.根據(jù)groupId刪除EnGroup中的記錄
* <br>3.刪除生詞表中的記錄
* <br>4.從新執(zhí)行添加操作,調(diào)用上面的添加方法
* @param as AddWordScreen
*/
public int updateWord(AddWordScreen as){
try{
//根據(jù)rsId,需要?jiǎng)h除原有的所有關(guān)聯(lián):清除CnDB中的所有關(guān)聯(lián),刪除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();
//根據(jù)ew中的senId,刪除生詞表中的id
if(ew.senId!=-1)
deleteOne(STRANGE_WORD,ew.senId);
//根據(jù)groupId刪除EnGroup中的記錄
deleteOne(EN_WORD_DB,ew.rsId);
//從新執(zhí)行添加操作,調(diào)用上面的添加方法
return addWord(as);
}
catch(Exception e){
e.printStackTrace();
return -1;
}
}
/**
* 刪除單個(gè)EnWord方法,該方法的執(zhí)行過(guò)程如下:<br>
* 1.刪除CnWord中關(guān)聯(lián)<br>
* 2.刪除EnGroup中的關(guān)聯(lián)<br>
* 3.刪除STRANGE_WORD中的關(guān)聯(lián)<br>
* 4.刪除EnWord本身
* @param rsId int 失?。?1,成功:正整數(shù)
*/
public int delEnWord(int rsId){
try{
//構(gòu)建EnWord對(duì)象
EnWord ew=new EnWord(rsId);
//刪除該EnWord與CnWord的關(guān)聯(lián)
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的關(guān)聯(lián)
if(ew.senId!=-1){
deleteOne(STRANGE_WORD,rsId);
}
//刪除該EnWord與EnGroup的關(guān)聯(lián)
WordGroup wg=new WordGroup(ew.word);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -