一.提要
英文词典是手机中经常使用的应用。因此,在本文将结合 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) { } } }
参考: