一.提要

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


参考:http://dev.10086.cn/cmdn/wiki/index.php?edition-view-5796-1.html

更多相关文章

  1. Android(安卓)启动服务配合AsyncTask 使用OKHttp 实现断点下载大
  2. 安全篇 - 隐式配置 KeyStore 签名信息
  3. Android(安卓)入门——App国际化之动态切换多语言小结
  4. 戒骄戒躁
  5. 一个关于android游戏下载静默安装功能的思路以及实现
  6. 在Android(安卓)studio里面使用AIDL
  7. android apk包反编译、破解心得
  8. Android(安卓)Paging分页库的学习(二)—— 结合Room数据库进行分页
  9. Android(安卓)GreenDao使用总结(包括模型生成、增删改查、修改存

随机推荐

  1. 一文了解 Kubernetes
  2. 活码二维码(动态二维码)域名池介绍
  3. 意派Epub360丨花式送祝福!这款新年H5模板
  4. MyCms 自媒体内容管理系统安装环境要求
  5. html基础知识01
  6. 1.Ement常用语法、元素属性和布局标签
  7. 认识元素、Ement语法
  8. 12.21作业
  9. Emmet 常用语法、HTML5元素基础知识
  10. 阿里云开源镜像站支持IPv6访问