1. 程式人生 > >基於Android的英文電子詞典

基於Android的英文電子詞典

一.提要

      英文詞典是手機中經常使用的應用。因此,在本文將結合 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)
		{
		}
	}
}