`

【转】实现电子词典要解决的技术问题及初步的解答

阅读更多
转自 [url] http://www.blogjava.net/nokiaguy/archive/2010/07/31/327623.html[/url]

引用
英文词典是手机中经常使用的应用。因此,在本文将结合Android来讨论如何实现一个Android版的英文词典。实现英文词典的方法很多。在本文使用了SQLite数据库来保存英文单词信息。系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息。当然,实现这样一个英文词典需要解决一系列技术问题。例如,如何将保存英文单词信息的数据库文件随程序(apk文件)一起发布;发布后如何打开数据库;如何在输入前几个字母后,在AutoCompleteTextView组件提示列表中显示以所输入字符串开头的所有单词。在本章将逐渐给出这些问题的详细答案。




实现电子词典要解决的技术问题及初步的解答

    在这里将给出实现电子词典需要解决的主要技术问题,并给出这些技术问题的初步答案或提示。关于详细的答案和代码请读者参阅本文后面的内容。
    主要技术问题及解答如下:
    1. 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
解答:可以将dictionary.db文件复制到Eclipse Android工程中的res\raw目录中,如图1所示。所有在res\raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。
                  


  图1   将dictionary.db文件复制到res\raw目录中

2. 如何将打开res\raw目录中的数据库文件?

解答:在Android中不能直接打开res\raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res\raw目录中资源的InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

3.  如果在AutoCompleteTextView组件中输入两个及以上字母时显示以所输入字符串开头的所有单词列表?

解答:AutoCompleteTextView所使用的Adapter是一个自定义的Adapter类,类的结构如下:


public class DictionaryAdapter extends CursorAdapter
{
      
}


要注意的是,不能将整个数据库中的单词都查出,然后生成一个Adapter对象再使用setAdapter方法来设置AutoCompleteTextView组件的Adapter对象。AutoCompleteTextView组件不会为我们筛选以某个字符串开头的单词。这些工作需要开发人员通过编码来实现。

基本思路是在AutoCompleteTextView类的afterTextChanged事件中监视AutoCompleteTextView组件中字符的输入情况,每当输入一个字符时就生成一个Adapter对象,然后将新生成的Adapter对象与AutoCompleteTextView关联。显示以输入字符串开头的单词列表的效果如图2所示。





                            图2  显示以输入字符串开头的单词列表

复制并打开保存英文单词的数据库文件

    在本文实现的英文词典中使用openDatabase方法来打开数据库文件(该文件在SD卡的dictionary目录中,因此,要想运行本文实现的英文词典,需要在手机或模拟器中需要安装SD卡)。如果该文件不存在,系统会自动创建/sdcard/dictionary目录,并将res\raw目录中的 dictionary.db文件复制到/sdcard/dictionary目录中。openDatabase方法的实现代码如下:
   
private SQLiteDatabase openDatabase()
    {
        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();
            }
            // 打开/sdcard/dictionary目录中的dictionary.db文件
            SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
                    databaseFilename, null);
            return database;
        }
        catch (Exception e)
        {
        }
        return null;
    }


在openDatabase方法中使用了几个常量,这些常量是在程序的主类(Main)中定义的,代码如下:


public class Main extends Activity implements OnClickListener, TextWatcher
{
    private final String DATABASE_PATH = android.os.Environment
            .getExternalStorageDirectory().getAbsolutePath()
            + "/dictionary";
    private final String DATABASE_FILENAME = "dictionary.db";
 
}


查询单词

    英文词典的核心就是查找英文单词的中文意思。在查找中文意思之前,首先需要使用openDatabase方法在Main类的onCreate方法中打开 SQLite数据库,代码如下:

database = openDatabase();

    其中database是在Main类中定义的SQLiteDatabase类型变量。
然后在查找按钮的单击事件中添加如下的代码来查找英文单词,并显示中文意思。

  
 public void onClick(View view)
    {
        String sql = "select chinese from t_words where english=?";    
        Cursor cursor = database.rawQuery(sql, new String[]
        { actvWord.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();

    }


讲到这里我们应该了解一个dictionary.db中的t_words表的结果,该表只有两个字段:english和chinese。分别表示单词的英文和中文描述。如果要获得单词的中文描述,只需要查找chinese字段即可。如onClick方法中的代码所示。

查询单词的效果如图3所示。




                                       图3  查询英文单词

如果显示以输入字符串开头的单词列表

      虽然到目前为止,我们的英文词典已经可以正常工作了,但为了方便读者使用,在本节将添加单词输入的自动提示功能。也就是说,如果读者在 AutoCompleteTextView组件中输入单词的前几个字母,该组件就会自动列出数据库中所有以该字符串开头的单词。效果如图2所示。拥有这样的功能就可以使用户在只知道单词的前几个字母时也可以查找到相应的单词。
       由于AutoCompleteTextView组件使用了自定义的Adapter类,下面先给出这个自定义的Adapter类的完整代码。
  
 public class DictionaryAdapter extends CursorAdapter
    {
        private LayoutInflater layoutInflater;
        @Override
        public CharSequence convertToString(Cursor cursor)
        {
            return cursor == null ? "" : cursor.getString(cursor
                    .getColumnIndex("_id"));
        }
        //  用于将_id字段(也就是english字段)的值设置TextView组件的文本
        //  view参数表示用于显示列表项的TextView组件
        private void setView(View view, Cursor cursor)
        {
            TextView tvWordItem = (TextView) view;
    tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor)
        {
            setView(view, cursor);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent)
        {
            View view = layoutInflater.inflate(R.layout.word_list_item, null);
            setView(view, cursor);
            return view;
        }
        public DictionaryAdapter(Context context, Cursor c, boolean autoRequery)
        {
            super(context, c, autoRequery);
            //  通过系统服务获得LayoutInflater对象
    
            layoutInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    }

在编写DictionaryAdapter类时应注意如下3点:

1. 为了将Cursor对象与AutoCompleteTextView组件绑定, DictionaryAdapter类必须从CursorAdapter类继承。

2. 由于CursorAdapter类中的convertToString方法直接返回了Cursor对象的地址,因此,在DictionaryAdapter类中必须覆盖convertToString方法,以返回当前选中的单词。CursorAdapter类中的convertToString方法的源代码。


   
public CharSequence convertToString(Cursor cursor)
    {
         //  如果cursor不为null,返回Cursor对象的地址(cursor.toString())
        return cursor == null ? "" : cursor.toString();
    }


覆盖后的convertToToString方法的源代码如下:


public CharSequence convertToString(Cursor cursor)
{
    return cursor == null ? "" : cursor.getString(cursor
                    .getColumnIndex("_id"));
}


在这里要注意一下,当选中AutoCompleteTextView组件中单词列表中某一个单词后,系统会用convertToString方法的返回值来设置AutoCompleteTextView组件中的文本。因此,必须使用Cursor的getString来获得相应的字段值。

3.  由于将Cursor对象与Adapter绑定时必须要有一个叫“_id”的字段,因此,在本例中将english字段名映射成了“_id”字段。

为了监视AutoCompleteTextView组件中的文本输入情况,需要实现android.text.TextWatcher接口。在该接口中只需要实现afterTextChanged方法即可,代码如下:


   
public void afterTextChanged(Editable s)
    {
        //  必须将english字段的别名设为_id 
        Cursor cursor = database.rawQuery(
                "select english as _id from t_words where english like ?",
                new String[]{ s.toString() + "%" });
        DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this,cursor, true);
        //  actvWord是在Main类中定义的AutoCompleteTextView 类型的变量
        actvWord.setAdapter(dictionaryAdapter);
    }


从上面的代码中可以看到,在查询SQL语句中的english字段名的别名是“_id”。

4.  在DictionaryAdapter类中需要使用bindView和newView方法设置每一个列表项。bindView方法负责设置已经存在的列表项,也就是该列表项已经生成了相应的组件对象。而newView方法负责设置新的列表项,在该方法中需要创建一个View对象来显示当前的列表项。在本例中使用word_list_item.xml布局文件来显示每一个列表项,代码如下:

 
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tvWordItem"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:textColor="#000"    
    android:minHeight="?android:attr/listPreferredItemHeight"
/>


本文介绍了实现基于Android的英文词典的实现方法。实现英文词典主要需要解决3个问题:如何将保存英文单词的SQLite数据库文件随同apk文件一起发布;如何打开SD卡中的数据库文件;如何在AutoCompleteTextView组件显示以输入字符串开头的英文单词列表。在最后仍然要提一句的是在编写自定义DictionaryAdapter类时一定要覆盖contertToString方法,以便在用户选项某一个列表项时在AutoCompleteTextView组件中显示选中的单词,而不是Cursor对象地址。

  • 大小: 23.1 KB
  • 大小: 58.5 KB
  • 大小: 55.1 KB
分享到:
评论

相关推荐

    TCP实现电子词典

    在这个“TCP实现电子词典”的项目中,我们将探讨如何利用TCP协议在Linux环境下构建一个具备查词和历史记录功能的电子词典应用。 首先,TCP是一个面向连接的、可靠的传输协议,它通过三次握手建立连接,并通过确认、...

    基于Qt电子词典的设计与实现

    《基于Qt电子词典的设计与实现》是一个毕业设计项目,主要使用了Qt框架来构建一个功能完备的电子词典应用。Qt是一个跨平台的应用程序开发框架,广泛应用于Linux、Windows和Mac OS等操作系统,尤其适合开发图形用户...

    java实现电子词典

    Java 实现电子词典是一种利用编程技术构建的数字化学习工具,它通常包含一系列功能,如单词查询、例句展示、发音播放等。本项目通过Java语言进行开发,结合了可视化的用户界面,使得用户能够方便地与应用进行交互。...

    C语言实现电子词典.

    《C语言实现电子词典——基于epoll的并发服务器与sqlite3数据库应用》 在信息技术领域,编程语言是实现各种应用程序的基础,而C语言作为其中的经典代表,以其高效、灵活的特点,广泛应用于系统级编程和嵌入式开发。...

    linux 环境下实现电子词典

    在Linux环境下实现电子词典,这是一个非常实用的项目,它能帮助用户查找和学习词汇,同时也为编程初学者提供了一个理解和应用数据结构——链表的绝佳机会。在这个项目中,我们将探讨如何使用C语言来构建一个基于链表...

    电子词典_电子词典txt_probablybrl_电子词典_

    总的来说,这个电子词典项目融合了计算机科学的多个领域,包括编程、数据处理、用户交互设计以及可访问性技术,体现了软件开发的综合性。通过理解和掌握这些知识点,开发者可以创建出功能强大且用户友好的电子词典...

    实现电子词典的基本功能

    源代码 实现插入单词,查找单词,删除单词电子词典的基本功能

    python实现电子词典

    self.root.title("电子词典") self.root.config(bg="#FFF") zdy_center_tip.Center_window(self.root,600,360,False) self.label1 = tkinter.Label(self.root, text="请输入单词:", font=("微软雅黑",12), bg="#...

    CASIO电子词典配套软件

    总的来说,CASIO电子词典配套的TextLoaderCn和CDLoaderCn软件极大地提升了电子词典的实用性,使用户可以自由定制学习资源,实现个性化学习。无论是文本资料还是音频文件,都能轻松导入,让CASIO电子词典成为真正的...

    JAVA设计实现电子词典.doc

    本项目的目的是实现一个电子词典,解决同学们在学习英语过程中遇到的困难。作为学生,我们经常碰到许多生词,需要不断地翻阅英语字典,以致影响学习效率。因此,我们小组决定开发一个电子词典,提供查询、添加、修改...

    C语言实现电子辞典(电子词典)

    C语言实现电子辞典(电子词典)C语言实现电子辞典(电子词典)C语言实现电子辞典(电子词典)C语言实现电子辞典(电子词典)C语言实现电子辞典(电子词典)C语言实现电子辞典(电子词典)C语言实现电子辞典(电子...

    基于java语言开发的电子词典

    基于Java语言开发的电子词典是一种高效、便捷的软件工具,它结合了现代计算机技术与语言学知识,为用户提供快速、准确的单词查询和翻译功能。这种应用程序通常包括词汇库、搜索算法、用户界面等多个关键组成部分,是...

    基于安卓的电子词典

    在技术实现层面,电子词典的关键在于数据库的设计和管理。数据库是存储大量词汇、释义和例句的中心,通常采用结构化数据存储方式,如关系型数据库。在安卓设备上,SQLite是一个常用的选择,它轻量级、高效,并能很好...

    linux下C语言实现的电子词典

    在Linux环境下,使用C语言开发一个电子词典查询...以上就是基于Linux的C语言电子词典系统的主要技术要点。实际开发过程中,你还需要结合具体需求,灵活应用这些知识点,构建出功能完备、用户体验良好的词典查询系统。

    基于Android的电子词典设计与实现doc.doc

    本着简洁高效的开发初衷,本文所讨论的Android电子词典直观展现本地查词、网络查词、添加生词等核心功能,用户从字面意思上可直接掌握基本功能的含义,以及操作应用。另外,作为开源的手机应用,-在法律政策方面与...

    利用tcp协议实现在线电子词典

    在构建一个基于TCP协议的在线电子词典时,我们需要深入理解TCP协议的工作原理,并结合Linux操作系统来实现这一目标。TCP(Transmission Control Protocol)是互联网协议栈中的传输层协议,它为应用程序提供了可靠的...

    Java实现发音电子词典

    总的来说,开发一个Java实现的发音电子词典需要对Java GUI编程、数据库操作以及文本转语音技术有深入理解。这样的项目不仅能提高开发者的技术能力,还能为用户提供一个实用的学习工具,尤其是在语言学习领域。在实际...

    数据结构点四级电子词典设计与实现

    在压缩包中,"数据结构课程设计双解电子词典报告.doc"包含了项目的详细设计报告,涵盖了设计理念、技术选型、系统架构、具体实现步骤以及遇到的问题和解决方案。"数据结构课程设计源代码(电子词典)"是项目的源代码...

Global site tag (gtag.js) - Google Analytics