⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbtool.java

📁 一個手機程序(電子詞典),一個不可多得的源碼程序,是學習J2ME的好東東.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -