基于Android的英文电子词典


一.提要

英文词典是手机中经常使用的应用。因此,在本文将结合 Android 来讨论如何实现一个 Android 版的英文词典。实现英文词典的方法很多。在本文使用了 SQLite 数据库来保存英文单词信息。系统通过 SQLite 数据库中保存的单词信息来查找到与指定英文对应的中文信息。当然,实现这样一个英文词典需要解决一系列技术问题。例如,如何将保存英文单词信息的数据库文件随程序( apk 文件)一起发布;发布后如何打开数据库。

先看最终效果:

二. 需要解决的几个问题

1.外部数据库的调用

首先得准备好词典的数据库文件,没有的点这里下载。

在res文件夹中新建raw文件夹,然后将数据库文件拷贝进去,最终像这样:

接着编写初始化函数,在主activy中的OnCreate函数调用就可以了:

  1.   public void init() 
  2.     { 
  3.  
  4.         try 
  5.         { 
  6.             // 获得dictionary.db文件的绝对路径  
  7.             String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; 
  8.             File dir = new File(DATABASE_PATH); 
  9.             // 如果/sdcard/dictionary目录中存在,创建这个目录  
  10.             if (!dir.exists()) 
  11.                 dir.mkdir(); 
  12.             // 如果在/sdcard/dictionary目录中不存在  
  13.             // dictionary.db文件,则从res\raw目录中复制这个文件到  
  14.             // SD卡的目录(/sdcard/dictionary)  
  15.             if (!(new File(databaseFilename)).exists()) 
  16.             { 
  17.                 // 获得封装dictionary.db文件的InputStream对象  
  18.                 InputStream is = getResources().openRawResource( 
  19.                         R.raw.dictionary); 
  20.                 FileOutputStream fos = new FileOutputStream(databaseFilename); 
  21.                 byte[] buffer = new byte[8192]; 
  22.                 int count = 0
  23.                 // 开始复制dictionary.db文件  
  24.                 while ((count = is.read(buffer)) > 0
  25.                 { 
  26.                     fos.write(buffer, 0, count); 
  27.                 } 
  28.  
  29.                 fos.close(); 
  30.                 is.close(); 
  31.             } 
  32.          
  33.         } 
  34.         catch (Exception e) 
  35.         { 
  36.         } 
  37.     }

2.数据库的初始化

创建一个DBHelper 继承SQLiteOpenHelper,来对打开和关闭数据库。

  1. package com.example.dictionary; 
  2.  
  3. import android.content.Context; 
  4. import android.database.sqlite.SQLiteDatabase; 
  5. import android.database.sqlite.SQLiteOpenHelper; 
  6. import android.util.Log; 
  7.  
  8. public class DBHelper extends SQLiteOpenHelper { 
  9.  
  10.     private static final String DATABASE_NAME = "dictionary.db";   
  11.     private static final int DATABASE_VERSION = 1;   
  12.     private final static String DATABASE_PATH = android.os.Environment 
  13.             .getExternalStorageDirectory().getAbsolutePath() 
  14.             + "/dictionary";   
  15.     public DBHelper(Context context) {   
  16.         //CursorFactory设置为null,使用默认值   
  17.         super(context, DATABASE_PATH + "/" + DATABASE_NAME, null, DATABASE_VERSION);   
  18.         System.out.println("New DBHelper!"); 
  19.          
  20.     }   
  21.    
  22.     @Override 
  23.     public void onCreate(SQLiteDatabase db) { 
  24.         // TODO Auto-generated method stub  
  25.         Log.d("DB""New DB!"); 
  26.         System.out.println("New DB!"); 
  27.         //db.execSQL("CREATE TABLE IF NOT EXISTS thing" +  "(_id INTEGER PRIMARY KEY AUTOINCREMENT, title VARCHAR, detail VARCHAR,isdone INTEGER)");   
  28.  
  29.     } 
  30.  
  31.  
  32.     @Override 
  33.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
  34.         // TODO Auto-generated method stub  
  35.         db.execSQL("ALTER TABLE thing ADD COLUMN other STRING");   
  36.     } 
  37.  
  38.  

3.再封装一个DBmanager,来管理数据库的操作

  1. package com.example.dictionary; 
  2.  
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5.    
  6. import android.content.ContentValues;   
  7. import android.content.Context;   
  8. import android.database.Cursor;   
  9. import android.database.sqlite.SQLiteDatabase;   
  10.    
  11. public class DBManager {   
  12.     private DBHelper helper;   
  13.     private SQLiteDatabase db;   
  14.        
  15.     public DBManager(Context context) {   
  16.         helper = new DBHelper(context);   
  17.         System.out.println("New DBManager!"); 
  18.         //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);   
  19.         //所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里   
  20.         db = helper.getWritableDatabase();   
  21.     } 
  22.        
  23.     /**  
  24.      * query all persons, return cursor  
  25.      * @return  Cursor  
  26.      */   
  27.      
  28.     public Cursor queryTheCursor(String[] word) {   
  29.         String sql = "select chinese from t_words where english=?";   
  30.         Cursor c = db.rawQuery(sql,word);   
  31.         return c;   
  32.     }   
  33.        
  34.     /**  
  35.      * close database  
  36.      */   
  37.     public void closeDB() {   
  38.         db.close();   
  39.     }   
  40. }   

三.主activity代码

  1. package com.example.dictionary; 
  2.  
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5.    
  6. import android.content.ContentValues;   
  7. import android.content.Context;   
  8. import android.database.Cursor;   
  9. import android.database.sqlite.SQLiteDatabase;   
  10.    
  11. public class DBManager {   
  12.     private DBHelper helper;   
  13.     private SQLiteDatabase db;   
  14.        
  15.     public DBManager(Context context) {   
  16.         helper = new DBHelper(context);   
  17.         System.out.println("New DBManager!"); 
  18.         //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);   
  19.         //所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里   
  20.         db = helper.getWritableDatabase();   
  21.     } 
  22.        
  23.     /**  
  24.      * query all persons, return cursor  
  25.      * @return  Cursor  
  26.      */   
  27.      
  28.     public Cursor queryTheCursor(String[] word) {   
  29.         String sql = "select chinese from t_words where english=?";   
  30.         Cursor c = db.rawQuery(sql,word);   
  31.         return c;   
  32.     }   
  33.        
  34.     /**  
  35.      * close database  
  36.      */   
  37.     public void closeDB() {   
  38.         db.close();   
  39.     }   
  40. }   

相关内容