利用AutoCompleteTextView连接到数据库实现自动提示功能

来源:互联网 发布:怎么软件赚钱最快 编辑:程序博客网 时间:2024/06/08 07:16

在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的


主要实现代码

MainActivity

package com.example.happydictionary;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import com.example.happydictionary.adapter.DictionaryAdapter;import com.example.happydictionary.db.DBHelper;import android.app.Activity;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.AutoCompleteTextView;import android.widget.Button;import android.widget.CursorAdapter;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener,TextWatcher {private DBHelper dbHelper; // 用户输入文本框private AutoCompleteTextView word; // 定义数据库的名字private SQLiteDatabase database;private Button searchWord; // 搜索按钮private TextView showResult; // 用户显示查询结果@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new DBHelper(getBaseContext());// 打开数据库database = dbHelper.openDatabase();init();searchWord.setOnClickListener(this); // 绑定监听器word.addTextChangedListener(this); // 绑定文字改变监听器}public void init() {searchWord = (Button) findViewById(R.id.btnSearch);word = (AutoCompleteTextView) findViewById(R.id.etWord);showResult = (TextView) findViewById(R.id.tvSearchResult);}public void afterTextChanged(Editable s) {Cursor cursor = database.rawQuery("select english as _id from t_words where english like ?",new String[] { s.toString() + "%" });// 新建新的AdapterDictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this,cursor, true);// 绑定适配器word.setAdapter(dictionaryAdapter);}public void beforeTextChanged(CharSequence s, int start, int count,int after) {}public void onTextChanged(CharSequence s, int start, int before, int count) {}public void onClick(View view) {// 查询指定的单词String sql = "select chinese from t_words where english=?";Cursor cursor = database.rawQuery(sql, new String[] { word.getText().toString() });String result = "查无该词"; // 如果查找单词,显示其中文的意思if (cursor.getCount() > 0) { cursor.moveToFirst(); // 须使用moveToFirst方法将记录指针移动到第1条记录的位置result = cursor.getString(cursor.getColumnIndex("chinese")).replace("&", "&");}showResult.setText(word.getText() + "\n" + result.toString());// 将结果显示到TextView中}}

DictionaryAdapter

package com.example.happydictionary.adapter;import com.example.happydictionary.R;import android.content.Context;import android.database.Cursor;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.CursorAdapter;import android.widget.TextView;//自定义Adapter类public class DictionaryAdapter extends CursorAdapter {private LayoutInflater layoutInflater;@Overridepublic CharSequence convertToString(Cursor cursor) {return cursor == null ? "" : cursor.getString(cursor.getColumnIndex("_id"));}// 将单词信息显示到列表中private void setView(View view, Cursor cursor) {TextView tvWordItem = (TextView) view;tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));}// 绑定选项到列表中@Overridepublic void bindView(View view, Context context, Cursor cursor) {setView(view, cursor);}// 生成新的选项@Overridepublic 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) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}}
WordDao

package com.example.happydictionary.dao;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.example.happydictionary.db.DBHelper;public class WordDao { private DBHelper dbHelper; private SQLiteDatabase sqLiteDatabase; public WordDao(Context context){ dbHelper=new DBHelper(context); }     public String getChinese(String english){     sqLiteDatabase=dbHelper.openDatabase();     String sql="select chinese from t_words where english=?";     Cursor cursor=sqLiteDatabase.rawQuery(sql, new String[]{english});     String chinese="查无该词";     if(cursor.moveToFirst()){     chinese=cursor.getString(cursor.getColumnIndex("chinese"));     }     return chinese;     }}
DBHelper

package com.example.happydictionary.db;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import com.example.happydictionary.R;import com.example.happydictionary.R.raw;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.os.Environment;import android.util.Log;/** * 实现将数据库文件从raw目录拷贝到手机里存放数据库的位置 *  * @author cabbage */public class DBHelper {private final int BUFFER_SIZE = 400000;public static final String DB_NAME = "idiom.db"; // 保存的数据库文件名public static final String PACKAGE_NAME = "com.example.happydictionary";// 应用的包名public static final String DB_PATH = "/data"+ Environment.getDataDirectory().getAbsolutePath() + "/"+ PACKAGE_NAME + "/databases";/*// SDCard 定义数据库的存放路径private final String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/dictionary";*/private Context context;public DBHelper(Context context) {this.context = context;}public SQLiteDatabase openDatabase() {try {File myDataPath = new File(DB_PATH);if (!myDataPath.exists()) {myDataPath.mkdirs();// 如果没有这个目录则创建}String dbfile = myDataPath + "/" + DB_NAME;if (!(new File(dbfile).exists())) {// 判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库InputStream is = context.getResources().openRawResource(R.raw.dictionary); // 欲导入的数据库FileOutputStream fos = new FileOutputStream(dbfile);byte[] buffer = new byte[BUFFER_SIZE];int count = 0;while ((count = is.read(buffer)) > 0) {fos.write(buffer, 0, count);}fos.close();is.close();}SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,null);return db;} catch (FileNotFoundException e) {Log.e("Database", "File not found");e.printStackTrace();} catch (IOException e) {Log.e("Database", "IO exception");e.printStackTrace();}return null;}}

word

package com.example.happydictionary.entity;public class Word {private String english;private String chinese;public String getEnglish() {return english;}public void setEnglish(String english) {this.english = english;}public String getChinese() {return chinese;}public void setChinese(String chinese) {this.chinese = chinese;}}
activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/mainbg"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <Button        android:id="@+id/btnSearch"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/etWord"        android:layout_alignBottom="@+id/etWord"        android:layout_marginLeft="16dp"        android:layout_toRightOf="@+id/etWord"        android:background="@drawable/ibsearchword"        android:onClick="searchWord"        android:text="@string/serachWord" />    <TextView        android:id="@+id/tvSearchResult"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_alignLeft="@+id/etWord"        android:layout_below="@+id/etWord"        android:layout_marginTop="22dp"        android:textSize="25sp"        android:background="@drawable/bg_roundcorner"        android:textAppearance="?android:attr/textAppearanceMedium" />       <AutoCompleteTextView        android:id="@+id/etWord"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:layout_marginTop="31dp"        android:background="@android:drawable/edit_text"        android:ems="10"        android:hint="@string/searchHint"        android:singleLine="true"        android:textColor="#552006"        android:textColorHint="#782f10" /></RelativeLayout>
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:gravity="center_vertical"    android:minHeight="?android:attr/listPreferredItemHeight"    android:paddingLeft="6dip"    android:textAppearance="?android:attr/textAppearanceLarge"    android:textColor="@color/gray" />


0 0