android AutoCompleteTextView+ SQLite 数据库保存搜索记录

搜索中需要记录用户的搜索历史,以方便用户在下次搜索时快捷搜索。

思路:

使用SQLite作为用户输入的记录,当用户查询时从数据库中取出数据作为AutoCompleteTextView的数据源。

具体代码:

1.在main.xml 或者 自己定义的xml文件中 增加 AutoCompleteTextView

<AutoCompleteTextView android:id="@+id/search_text" android:layout_width="0dip"
android:layout_height="wrap_content" android:layout_weight="1.0"
android:layout_marginTop="6dip" android:layout_marginBottom="6dip"
android:clickable="true" android:inputType="none"
android:textSize="18sp" android:textStyle="normal"
android:textColor="@android:color/primary_text_light"
android:textColorHint="@color/search_hint" />

2.数据库操作,这里可以写你自己具体的数据库操作,下面是我的代码

public class Complete_Db {

public static SQLiteDatabase db;
public static String filepath;
public static void CreateDB(String dbName,Context context){
filepath = context.getFilesDir().toString()+"/"+dbName;
db = SQLiteDatabase.openOrCreateDatabase(filepath, null);
}
public static boolean Insert(String name){
boolean result = false;
try{
System.out.println("db state:"+db.isOpen());
if(!db.isOpen())
db.openOrCreateDatabase(filepath, null);
ContentValues value = new ContentValues();
value.put("name", name);
db.insertOrThrow("input", null, value);
//db.execSQL("insert into input values(null,?)",new String[]{name});
}catch(SQLException e){
e.printStackTrace();
db.execSQL("create table input(id integer primary key autoincrement,name varchar(100))");
ContentValues value = new ContentValues();
value.put("name", name);
db.insertOrThrow("input", null, value);
//db.execSQL("insert into input values(null,?)",new String[]{name});
}
finally{
Log.i("insert into db",name);
}
return result;
}
public static Cursor Query(String query){

if(query != null){
try{
if(!db.isOpen())
db.openOrCreateDatabase(filepath, null);
String selection = "name like \'" + query +"%\'";
return db.query("input",new String[]{"name"}, selection, null, null, null, null);
}
catch(SQLException e)
{
db.execSQL("create table input(id integer primary key autoincrement,name varchar(100))");
String selection = "name like \'" + query +"%\'";
return db.query("input",new String[]{"name"}, selection, null, null, null, null);
}

}
else
return null;
}
public static void Close(){
if(db!=null && db.isOpen())
db.close();
}
public static void Clear(){
//清空搜索数据库

try{
if(!db.isOpen())
db.openOrCreateDatabase(filepath, null);
db.execSQL("delete * from input");
}catch(SQLException e){
e.printStackTrace();
}
}
}

3.在Activity 中调用

AutoCompleteTextView searchText = (AutoCompleteTextView)findViewById(R.id.search_text);

Complete_Db.CreateDB("search.db", SearchActivity.this);
List<String> search_hint = new ArrayList<String>();
System.out.println("query string :"+searchText.getText().toString().trim());
Cursor cursor = Complete_Db.Query(searchText.getText().toString().trim());
cursor.moveToFirst();
while(cursor.isAfterLast() == false){
Log.i("query result",cursor.getString(0));
search_hint.add(cursor.getString(0));
cursor.moveToNext();
}

search_hint.add("清除历史");//用于清除历史记录
String hints[] = new String[search_hint.size()];
search_hint.toArray(hints);
ArrayAdapter<String> adapter= new ArrayAdapter<String>(
SogouSearchActivity.this, R.layout.auto_complete_list,hints);
for(int i=0;i<hints.length;i++){
System.out.println("db string:"+hints[i]);
}

searchText.setAdapter(adapter);
cursor.close();
searchText.setThreshold(1);
searchText.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
if(searchText.getText().toString().equals("清除历史")){
Log.i("touch clear","history");
Complete_Db.Clear();
searchText.setText(null);
}
}
});

另外需要增加一个事件,用于监听当输入改变时从数据库中取数据:

searchText.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
List<String> search_hint = new ArrayList<String>();
System.out.println("query string :"+searchText.getText().toString().trim());
Cursor cursor = Complete_Db.Query(searchText.getText().toString().trim());
cursor.moveToFirst();
while(cursor.isAfterLast() == false){
Log.i("query result",cursor.getString(0));
search_hint.add(cursor.getString(0));
cursor.moveToNext();
}
search_hint.add("清除历史");
String hints[] = new String[search_hint.size()];
search_hint.toArray(hints);
ArrayAdapter<String> adapter= new ArrayAdapter<String>(
SogouSearchActivity.this, R.layout.auto_complete_list,hints);
for(int i=0;i<hints.length;i++){
System.out.println("db string:"+hints[i]);
}
searchText.setAdapter(adapter);
}

public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}

public void onTextChanged(CharSequence s, int start, int before,
int count) {
Log.i("text",s.toString());
// TODO Auto-generated method stub
}
});


@Override
public void onDestroy(){
super.onDestroy();
Complete_Db.Close();
}

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android平台中各类恶意软件及病毒概览
  3. Android平台实现与Apache Tomcat服务器数据交互(MySql数据库)
  4. SqliteGen——自动生成 SQLite 数据库的访问类
  5. 【Android(安卓)Developers Training】 5. 序言:添加Action Bar
  6. Android数据库(SQLite)的简单使用——增、删、查改功能的简单实现
  7. Android(安卓)SQLite数据库使用INTO子句创建新表时报错
  8. ColorMatrixColorFilter颜色过滤(离线用户的灰色头像处理)
  9. Android数据库ContentProvider封装原理

随机推荐

  1. Android中listview中的button
  2. 《Android传感器高级编程》
  3. 请介绍下Android中常用的五种布局
  4. android应用安全——通信安全(android htt
  5. Android找不到Manifest系统文件
  6. Android(安卓)高级UI组件
  7. 创建Android工程时报错:Errors running b
  8. Android:控件GridView的使用
  9. Android(安卓)Spinner自动弹出列表,设置ti
  10. Eclipse中Android项目XML文件的格式化配