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所示。
如果显示以输入字符串开头的单词列表虽然到目前为止,我们的英文词典已经可以正常工作了,但为了方便读者使用,在本节将添加单词输入的自动提示功能。也就是说,如果读者在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类型的变量
总结:
面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。
有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。
附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
- “%” });
DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this,cursor, true);
//actvWord是在Main类中定义的AutoCompleteTextView类型的变量
总结:
面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。
有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。
附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
[外链图片转存中…(img-MH2AfYeq-1720081520672)]