AutoCompleteTextView 与sqlite绑定实现记住用户输入的内容并自动提示

把用户输入的内容保存到数据库表中,然后用户输入时,进行模糊查询并把查询结果附到AutoCompleteTextView中。

1:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical" >  
      
    <AutoCompleteTextView  
            android:id="@+id/actValue"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content" 
            android:completionThreshold="1"
            android:singleLine="true"/>        
            
    <Button 
        android:id="@+id/btnClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Click"/>
  
      
</LinearLayout>  

2:DbUtil.java

package com.example.autotest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DbUtil extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 10;        //当前数据库版本
    private static final String DATABASE_NAME = "wzh.db";
    
    private static final String TABLE_AUTO = "auto";    //国税邮件表
    
    private static final String CREATE_TABLE_AUTO_SQL = "create table " +
            TABLE_AUTO + "( _id integer primary key autoincrement, "+
                          " value varchar)";
    
    
    public DbUtil(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    
    /*
     * 数据库第一次被创建时调用onCreate
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_AUTO_SQL);
    }
    
    /*
     * 如果 DATABASE_VERSION 改变 系统会调用onUpgrade
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        
        db.execSQL("drop table if exists " + TABLE_AUTO);

        onCreate(db);
    }
}

3:DBManager.java

package com.example.autotest;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {
    private DbUtil dbUtil = null;
    private SQLiteDatabase db = null;
    
    public DBManager(Context context){
        dbUtil = new DbUtil(context);
        db = dbUtil.getWritableDatabase();
    }
    
    public boolean valueExist(String value){
        int count = 0;
        Cursor c = db.rawQuery("select _id from auto where value = ?", 
                    new String[]{value});
        if(c.moveToNext()){
            count = c.getInt(c.getColumnIndex("_id"));
        }
        c.close();
        return count>0?true:false;
    }
    
    public void addAutoValue(String value){
        if(value!=null && value.length()>0){
            db.beginTransaction();
            try{
                String sql = "insert into auto(_id,value) values(null,?)";
                db.execSQL(sql, new Object[]{value});
                db.setTransactionSuccessful();
            }finally{
                db.endTransaction();
            }
        }
    }
    
    public Cursor selectAutoValues(String value){
        String sql = "select _id,value from auto where value like ? limit 10";
        Cursor c = db.rawQuery(sql, new String[]{"%"+value+"%"});
        return c;
    }
    
    

    /**
     * 关闭数据连接资源
     */
    public void dbClose(){
        if(null != db){
            db.close();
        }    
    }
}

4:AutoCompleteAdater.java

package com.example.autotest;

import android.content.Context;
import android.database.Cursor;
import android.widget.SimpleCursorAdapter;

public class AutoCompleteAdater extends SimpleCursorAdapter{
    private DBManager dbManager = null;
    private Context context;

    // 查询字段
    private String value;
    
    @SuppressWarnings("deprecation")
    public AutoCompleteAdater(Context context, int layout, Cursor c,String from, int to) {
       super(context, layout, c, new String[] { from },new int[] { to });
       this.context = context;
       this.value = from;
    }
    
    /**
     * 动态查询数据库
     */
    @Override
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
       if (constraint != null) {
           return getDbManager().selectAutoValues((String) constraint);
       } else {
           return null;
       }
    }
    
    /**
     * 这里设置在弹出的提示列表中点击某一项后的返回值,返回值将被显示在文本框中
     */
    @Override
    public CharSequence convertToString(Cursor cursor) {
       return cursor.getString(cursor.getColumnIndex(value));
    }
    
    
    public DBManager getDbManager(){
        return dbManager==null?new DBManager(this.context):dbManager;
    }
}

5:MainActivity.java

package com.example.autotest;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;

public class MainActivity extends Activity {
    private AutoCompleteTextView actValue = null;
    private Button btnClick = null;
    private DBManager dbManager = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        actValue = (AutoCompleteTextView) findViewById(R.id.actValue);
        btnClick = (Button)findViewById(R.id.btnClick);

        
        AutoCompleteAdater cursorAdapter = new AutoCompleteAdater(
                this,
                android.R.layout.simple_dropdown_item_1line,
                null,
                "value",
                android.R.id.text1
            );
        actValue.setAdapter(cursorAdapter);
        
        dbManager = new DBManager(this);
        
        btnClick.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                String value = actValue.getText().toString();
                dbManager.addAutoValue(value);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(dbManager!=null){
            dbManager.dbClose();
        }
    }
}

 

 

java.lang.Object
   ↳ android.view.View
     ↳ android.widget.TextView
       ↳ android.widget.EditText
         ↳ android.widget.AutoCompleteTextView

  可以看出AutoCompleteTextView继承自EditText,所以它实际上也是一个文本编辑框,只是多了一个自动提示补全功能,EditText的所有功能AutoCompleteTextView都能实现,其对EditTextAPI进行了丰富。

posted @ 2014-03-04 07:58  yshy  阅读(716)  评论(0编辑  收藏  举报