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

2023-05-16

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

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


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

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

[img]http://dl.iteye.com/upload/attachment/294863/7326afaf-e248-33ce-9266-6527974b1ca9.jpg[/img]

图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所示。


[img]http://dl.iteye.com/upload/attachment/294867/5a38aad4-a4db-38ec-987f-cee643135f32.jpg[/img]


图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所示。


[img]http://dl.iteye.com/upload/attachment/294869/193bb099-89e3-38e1-b5c0-ae9ef3f8f754.jpg[/img]

图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对象地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 2011移动开发者大会亮点之一:六大精彩主题论坛抢鲜看

    2011中国移动开发者大会将是2011年度中国最大规模的移动盛事 本次大会全面覆盖软件应用和服务 平台 运营商 终端 芯片等移动产业链各个领域 xff0c 与此同时 xff0c 专注于产业链中最活跃的因素 应用软件的研发 创新与商业模式 x
  • IT毕业生给学弟学妹们的真心话——离校座谈记录

    活动 xff1a 2009级毕业生离校前座谈 地点 xff1a 烟台大学计算机学院4409学业指导工作室 组织 xff1a 烟台大学CSDN高校俱乐部 时间 xff1a 2013年6月1日 上午8 30 参加人员 xff1a 主持人 xff
  • activemq的几种基本通信方式总结

    简介 在前面一篇文章里讨论过几种应用系统集成的方式 xff0c 发现实际上面向消息队列的集成方案算是一个总体比较合理的选择 这里 xff0c 我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨 activemq是JMS消息通
  • 生活就是工作学习锻炼身体

    多做事情多学习 少浪费时间 业精于勤荒于嬉 xff0c 行成于思而毁于随
  • Windows下Gvim7.1的字体和颜色配置

    首先在windows下安装Gvim7 1 然后再gvim里的 编辑菜单里 选择字体 里选择一种字体一般编程序用Courier New 字体 选择字号 xff0c 并且在 编辑菜单里选择一种 自己喜欢的 配色方案 按ESC进入命令模式然后输入
  • FreeRTOS学习日记-3(列表和列表项)

    列表与列表项 列表结构体如下 typedef struct xLIST listFIRST LIST INTEGRITY CHECK VALUE 检查列表完整性 configLIST VOLATILE UBaseType t uxNumbe
  • Linux源代码目录树结构

    Linux用来支持各种体系结构的源代码包含大约4500个C语言程序 xff0c 存放在270个左右的子目录下 xff0c 总共大约包含200万行代码 xff0c 大概占用58MB磁盘空间 源代码所有在目录 xff1a usr src lin
  • 重要性抽样方法

    考虑积分 xff1a 设 1 是 0 xff0c 1 上的均匀随机变量 xff0c 则 xff1a 是 I 的无偏估计 xff0c n 足够大时 xff0c In 会十分接近 I 但是 In 方差的大小依赖于 f 的方差 xff0c 当 f
  • linux 挂载点

    linux unix这类操作系统将系统中的一切都作为文件来管理 在windows中我们常见的硬件设备 磁盘分区等 xff0c 在linux unix中都被视作文件 xff0c 对设备 分区的访问就是读写对应的文件 挂载点实际上就是linux
  • 近期刷题的c语言总结。

    首先是三个数学函数 span style font size 14px strong 函数名 xff1a floor 功 能 xff1a 下舍入 xff0c 返回小于或者等于指定表达式的最大整数 说明 xff1a 返回x的下限 xff0c
  • http parser 基本用法

    手动解析HTML是一件很崩溃的事情 xff0c sun的swing里也有解析HTML的东东 xff0c 不过已经是古董了 xff0c 实在不好拿出来丢Java的人了 今天要用的是Apache的一个开源项目 xff0c html parser
  • Java中队列FIFO(First-In-First-Out),栈LIFO(Last-In-First-Out)的实现

    size 61 small Deque接口定义了QUEUE First In First Out 的功能 xff0c 同时也定义了Stack Last In First Out 的功能 java util Deque lt E gt A l
  • STM32 USB应用笔记

    STM32 USB应用笔记 USB 作者 gashero 日期 2013 02 06 目录 1 简介 2 STM32的USB简介 3 USB实现类 3 1 USB CDC 4 代码分析 4 1 stm32f4 discovery usb c
  • 关于MBR和GUID分区的问题

    很多新手在制作Mac安装盘时 xff0c 会遇到一个问题 xff0c 就是替换OSinstall 系统才可以安装在MBR分区 xff0c 当看其他教程时又发现一个问题 xff0c 什么是GUID xff0c 什么是GPT xff0c 所以我
  • Eclipse中js文件含中文无法保存的问题解决

    js文件含中文时会报Save could not be completed xff0c 而无法保存 因为js 文件默认是 ISO8859 1 编码 xff0c 解决方法如下 xff1a 在 Window 菜单里面找到 Preferences
  • 浅谈如何学习linux

    一 为什么要学linux 当然最重要是爱好和兴趣 xff01 如果你这种必要学 xff0c 或者根本不喜欢 xff0c 请不要浪费时间 xff0c 你学也学不好 xff01 二 起步 你应该为自己创造一个学习linux的环境 在电脑上装一个
  • FreeRTOS学习日记-4(调度开启与任务相关函数深究)

    任务调度器开启函数vTaskStartScheduler 与空闲任务 这个函数内会自动创建一个名为 IDLE 空闲任务 xReturn 61 xTaskCreate prvIdleTask 1 34 IDLE 34 configMINIMA
  • 面向应用服务器的开发

    ooa oop 太慢了 现在流行ooas的开发 xff0c 我称之为面向应用服务器的开发 比如 两年前流行在wls上写ejb 五年前流行在win上写com 等等 xff0c win不是os吗 xff0c 怎么叫它做as 没错的 xff0c
  • 8086的最小模式和最大模式

    一 最小模式和最大模式 8086 8088可以在两种工作模式下工作 xff0c 即最小模式和最大模式 最小模式 xff0d xff0d 即系统中只有8086 xff08 或 8088 xff09 一个微处理器 最小模式是单处理器系统 系统中
  • udp cksum

    目前碰到一个奇怪的现象 xff0c 某台机器 xff08 就叫hostA吧 xff09 上面tx checksumming是开启状态下 xff0c 所有本地发出去的UDP报文用tcpdump vvv udp抓出来 xff0c 凡是从这台主机

随机推荐

  • java菜鸟程序员2012年度总结——分享、收获与感恩并存

    前言 xff1a 又是一年总结时啊 本来总结打算前几天就该写的 但由于一直在忙最后的期末考试 xff0c 今天终于考完了 现在终于有时间来对这一年进行总一下了 刚开始的时候想了半天不知道该用什么题目好 想了想 xff0c 今年的博客一直围绕
  • C语言 推箱子小游戏 可重玩 可选关 保存记录

    转载请保留此行 xff0c 来自Vic 这是DLNU大一的题目 xff0c 估计我发上来后 xff0c 这个课题的难度大大降低 可以随意增加地图 根据20 20的画就行 0 可移动 1 墙 2 目的地 3 箱子 5 玩家 记得也要增加 存在
  • C/C++ 获得键盘按键代码

    写推箱子小游戏的时候需要读取键盘 写了个快速获得代码的小程序 include lt iostream gt include lt conio h gt int main int a while 1 a 61 getch std cout l
  • C语言中的转义字符

    C语言中的转义字符 简介 在字符集中 xff0c 有一类字符具有这样的特性 xff1a 当从键盘上输入这个字符时 xff0c 显示器上就可以显示这个字符 xff0c 即输入什么就显示什么 这类字符称为可显示字符 xff0c 如a b c 4
  • Eclipse:全局搜索和更替

    Eclipse 中全局搜索和更替 Eclipse 全局搜索步骤 使用快捷键 ctrl 43 H 打开文件搜索对话框 xff0c 选择 File Search 标签 xff0c 在 Containing text 中输入你需要搜索的字符串 x
  • 研发人员绩效评价常见误区

    1 光环化 xff1a 将被评价人某一优点或缺点扩大 xff0c 以偏概全 xff0c 一好百好 xff0c 或一无是处 xff0c 凭个人印象评价下属 2 宽容化 严格化 xff1a 评价人怕承担责任 xff0c 有意放松评价标准 xff
  • malloc分配的内存空间是连续的吗

    1 linux内核管理内存空间的分配 xff0c 所有程序对内存空间的申请和其他操作 xff0c 最终都会交给内核来管理 2 linux实现的是 虚拟内存系统 xff0c 对用户而言 xff0c 所有内存都是虚拟的 xff0c 也就是说程序
  • NLP参考资源

    https antkillerfarm github io NLP参考资源 https mp weixin qq com s 4eyxX EfrImGXnYmTRUFHw 自然语言处理 NLP 入门指南 https www geekhub
  • 找工作笔试面试那些事儿(15)---互联网公司面试的零零种种和多家经验

    作者 xff1a 寒小阳 时间 xff1a 2013年9月 出处 xff1a http blog csdn net han xiaoyang article details 11400719 声明 xff1a 版权所有 xff0c 转载请注
  • 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)...

    最近这个话题频频出现 xff0c 而且讨论地越来越激烈 xff0c 也越来越有趣 最开始是在人人网上当做笑口被大家广为扩散的那张图片 xff0c 某大学在申请出国联系导师的时候使用 数字 64 qq com的邮箱 xff1b 之后又有了如下
  • linux(边压缩边传输边解压)

    比如我要转移旧VPS home wwwroot 下的web目录到新VPS 123 123 123 123 的 home wwwroot 目录下 1 进入目录 cd home wwwroot 2 压缩 xff0c 传输 xff0c 解压同步进
  • 让Editplus和SVN集成

    很多人用Editplus xff0c 但是修改了文件后 xff0c 需要切换到文件目录 xff0c 点击鼠标右键使用TortoiseSVN的提交菜单项来提交 xff0c 需要增加很多鼠标点击和确认的操作 xff0c 对于频繁修改的文件来说
  • 服务器是否支持断点续传

    通常情况下 xff0c Web服务器 如Apache 会默认开启对断点续传的支持 因此 xff0c 如果直接通过Web服务器来提供文件的下载 xff0c 可以不必做特别的配置 xff0c 即可享受到断点续传的好处 断点续传是在发起HTTP请
  • git-cola

    http git cola github io downloads html you can get a binary git cola https github com git cola git cola archive v2 3 tar
  • 北邮IT类就业攻略

    发信人 noobody everybody 信区 Job 标 题 北邮IT类就业攻略 发信站 北邮人论坛 Sun Sep 6 12 16 28 2009 站内 不久前发了那篇 盘点IT类就业方向 的文章 xff0c 感受到了师弟师妹们对找工
  • Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的...

    Android开发又将带来新一轮热潮 xff0c 很多开发者都投入到这个浪潮中去了 xff0c 创造了许许多多相当优秀的 应用 其中也有许许多多的开发者提供了应用开源项 目 xff0c 贡献出他们的智慧和创造力 学习开源代码 是掌握技术的一
  • 关于Java加密扩展的出口限制

    近日 xff0c 在Matrix Security版上 http www matrix org cn thread shtml topicId 61 39543 amp forumId 61 55 提出一个问题 xff0c 即他的程序不能正
  • Win7 USB接口无法使用/驱动错误/该设备无法启动。(代码10) 故障解决方法

    电脑USB接口突然有一个不能用了 xff0c 开始以为是驱动问题 xff0c 可是用好几个驱动软件 xff08 驱动精灵 驱动人生等 xff09 更新驱动都无法解决 xff0c 后来发现在设备管理器里有一个设备驱动有问题 xff0c 尝试卸
  • Linux操作手册

    Linux操作手册 查看防火墙是否开启 systemctl status firewalld 开启防火墙 systemctl start firewalld 关闭防火墙 systemctl stop firewalld 查看所有开启的端口
  • 【转】实现电子词典要解决的技术问题及初步的解答

    转自 url http www blogjava net nokiaguy archive 2010 07 31 327623 html url quote 英文词典是手机中经常使用的应用 因此 xff0c 在本文将结合Android来讨论