基於Android的英文電子詞典
阿新 • • 發佈:2019-01-29
一.提要
英文詞典是手機中經常使用的應用。因此,在本文將結合 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)
{
}
}
}