基于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)
		{
		}
	}
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值