?? dbtool.java~310~
字號:
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的關聯
WordGroup wg=new WordGroup(ew.word);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -