一.提要

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

   先看最终效果:

二. 需要解决的几个问题

1.外部数据库的调用

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

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

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

public void init() 	{  		try 		{ 			// 获得dictionary.db文件的绝对路径 			String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; 			File dir = new File(DATABASE_PATH); 			// 如果/sdcard/dictionary目录中存在,创建这个目录 			if (!dir.exists()) 				dir.mkdir(); 			// 如果在/sdcard/dictionary目录中不存在 			// dictionary.db文件,则从res\raw目录中复制这个文件到 			// SD卡的目录(/sdcard/dictionary) 			if (!(new File(databaseFilename)).exists()) 			{ 				// 获得封装dictionary.db文件的InputStream对象 				InputStream is = getResources().openRawResource( 						R.raw.dictionary); 				FileOutputStream fos = new FileOutputStream(databaseFilename); 				byte[] buffer = new byte[8192]; 				int count = 0; 				// 开始复制dictionary.db文件 				while ((count = is.read(buffer)) > 0) 				{ 					fos.write(buffer, 0, count); 				}  				fos.close(); 				is.close(); 			} 		 		} 		catch (Exception e) 		{ 		} 	}
2.数据库的初始化

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

package com.example.dictionary;  import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;  public class DBHelper extends SQLiteOpenHelper {  	private static final String DATABASE_NAME = "dictionary.db";       private static final int DATABASE_VERSION = 1;   	private final static String DATABASE_PATH = android.os.Environment 			.getExternalStorageDirectory().getAbsolutePath() 			+ "/dictionary";       public DBHelper(Context context) {           //CursorFactory设置为null,使用默认值           super(context, DATABASE_PATH + "/" + DATABASE_NAME, null, DATABASE_VERSION);           System.out.println("New DBHelper!");              }      	@Override 	public void onCreate(SQLiteDatabase db) { 		// TODO Auto-generated method stub 		Log.d("DB", "New DB!"); 		System.out.println("New DB!"); 		//db.execSQL("CREATE TABLE IF NOT EXISTS thing" +  "(_id INTEGER PRIMARY KEY AUTOINCREMENT, title VARCHAR, detail VARCHAR,isdone INTEGER)");    	}   	@Override 	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 		// TODO Auto-generated method stub 		db.execSQL("ALTER TABLE thing ADD COLUMN other STRING");   	}   }
3.再封装一个DBmanager,来管理数据库的操作

package com.example.dictionary;  import java.util.ArrayList;   import java.util.List;      import android.content.ContentValues;   import android.content.Context;   import android.database.Cursor;   import android.database.sqlite.SQLiteDatabase;      public class DBManager {       private DBHelper helper;       private SQLiteDatabase db;              public DBManager(Context context) {           helper = new DBHelper(context);          System.out.println("New DBManager!");         //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);           //所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里           db = helper.getWritableDatabase();       }            /**       * query all persons, return cursor       * @return  Cursor       */            public Cursor queryTheCursor(String[] word) {       	String sql = "select chinese from t_words where english=?";	     	Cursor c = db.rawQuery(sql,word);          return c;       }              /**       * close database       */       public void closeDB() {           db.close();       }   }
三.主activity代码

package com.example.dictionary;  import java.io.File; import java.io.FileOutputStream; import java.io.InputStream;   import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;  public class MainActivity extends Activity {  	private DBManager mgr;  	private final String DATABASE_PATH = android.os.Environment 			.getExternalStorageDirectory().getAbsolutePath() 			+ "/dictionary"; 	private final String DATABASE_FILENAME = "dictionary.db"; 	private Button SearchBtn; 	private EditText inputText; 	private TextView resultText; 	 	@Override 	public void onCreate(Bundle savedInstanceState) { 		super.onCreate(savedInstanceState); 		setContentView(R.layout.activity_main); 		mgr=new DBManager(this); 		SearchBtn=(Button)findViewById(R.id.button1); 		inputText=(EditText)findViewById(R.id.editText1); 		resultText=(TextView)findViewById(R.id.textView1); 		SearchBtn.setOnClickListener(new SearchOnClickListener()); 	}  	@Override 	public boolean onCreateOptionsMenu(Menu menu) { 		getMenuInflater().inflate(R.menu.activity_main, menu); 		return true; 	} 	public class SearchOnClickListener implements OnClickListener 	{  		@Override 		public void onClick(View v) { 			// TODO Auto-generated method stub 				 			Cursor cursor = mgr.queryTheCursor(new String[] 			{ inputText.getText().toString() }); 			String result = "未找到该单词."; 			//  如果查找单词,显示其中文的意思 			if (cursor.getCount() > 0) 			{ 				//  必须使用moveToFirst方法将记录指针移动到第1条记录的位置 				cursor.moveToFirst(); 				result = cursor.getString(cursor.getColumnIndex("chinese")); 			} 			//  显示查询结果对话框 			//new AlertDialog.Builder(this).setTitle("查询结果").setMessage(result).setPositiveButton("关闭", null).show(); 			resultText.setText(result); 		} 		 	} 	public void init() 	{  		try 		{ 			// 获得dictionary.db文件的绝对路径 			String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME; 			File dir = new File(DATABASE_PATH); 			// 如果/sdcard/dictionary目录中存在,创建这个目录 			if (!dir.exists()) 				dir.mkdir(); 			// 如果在/sdcard/dictionary目录中不存在 			// dictionary.db文件,则从res\raw目录中复制这个文件到 			// SD卡的目录(/sdcard/dictionary) 			if (!(new File(databaseFilename)).exists()) 			{ 				// 获得封装dictionary.db文件的InputStream对象 				InputStream is = getResources().openRawResource( 						R.raw.dictionary); 				FileOutputStream fos = new FileOutputStream(databaseFilename); 				byte[] buffer = new byte[8192]; 				int count = 0; 				// 开始复制dictionary.db文件 				while ((count = is.read(buffer)) > 0) 				{ 					fos.write(buffer, 0, count); 				}  				fos.close(); 				is.close(); 			} 		 		} 		catch (Exception e) 		{ 		} 	} }

参考: