野人学Android第二弹——AutoCompleteTextView自动搜索数据库

本文探讨了如何利用AutoCompleteTextView在大量数据时与数据库交互,通过CursorAdapter实现自动搜索功能。重点讲解了CursorAdapter的工作原理,虽然标题提及自动搜索数据库,但实际上更侧重CursorAdapter的原理介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AutoCompleteTextView的作用不言而喻,可以减少输入量,提高效率。比如说,你想在TextView中输入五个字,而用了AutoCompleteTextView这个控件后,只需要输入两个字就会弹出你想要的“五个字”,然后选中就OK了。推敲一下,这“五个字”是预先放在了一个数组中,所以可以根据输入的“两个字”进行匹配,出现刚才说的那种效果,就像百度搜索中的历史数据一样。那么,当历史数据的量很大的时候,如何实现呢?总不能还是放在数组中吧。那,这里就会涉及到数据库的使用。


在View和Data之间进行沟通,那么就需要Adapter登场了。在这里,大显身手的Adapter是CursorAdapter。来看下文档是怎么解释这个Adapter的吧。


蓝色的英文字大意为:

这个适配器是将Cursor中的数据赋值给一个控件,比如说Listview之类的。Cursor必须包含“_id”的数据集信息,否则这个class就不会工作。另外,如果合并的Cursors已经在它们的“_id”数据集中覆盖数据,那么使用了MergeCursor的class就不会起到作用。


从这个文字中,可以看出Cursor是一个必不可少的角色,那么Cursor作为一个指针,在sqlite的查询中会涉及到,也就是说这个Adapter会和数据库有直接的关系。我已经写了一个继承CursorAdapter的类,代码如下:

package com.example.sometest;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.provider.OpenableColumns;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

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

class MyCursorAdpter extends CursorAdapter {       
    private SQLiteDatabase sqlite;
    private String results;
    //引入sqlite
	public MyCursorAdpter(Context context, Cursor c, SQLiteDatabase sqlite) {    
        super(context, c);    
        this.sqlite = sqlite;    
    }    
    @Override    
    public View newView(Context context, Cursor cursor, ViewGroup parent) {  
//    	Log.i("info", "newView");
        final LayoutInflater inflater = LayoutInflater.from(context);    
        final TextView view = (TextView) inflater.inflate(    
                android.R.layout.simple_dropdown_item_1line, parent, false);    
        return view;    
    }    
    @Override    
    public void bindView(View view, Context context, Cursor cursor) {    
//    	Log.i("info", "bindView");
        ((TextView) view).setText(cursor.getString(cursor.getColumnIndex("name")));    
    }    
        
    /*
     * 在结果中选中某个值后,显示在TextView中的值
     */
    @Override    
    public String convertToString(Cursor cursor) {    
       
//        Log.i("info", cursor.getString(cursor.getColumnIndex("name")));
        return cursor.getString(cursor.getColumnIndex("name")); 
    } 
    /*
     * 这个方法根据TextView输入的字符串,在数据库中进行匹配,从而获得cursor,这个cursor包含了数据信息
     */
    @Override    
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {    
        if (constraint != null) {   
//        	Log.i("info", "runQueryOnBackgroundThread");
            String selection = "name like \'" + constraint.toString() +"%\'";  
            return sqlite.query("test", null, selection, null, null, null, null); 
        	
        }    
        else {    
            return null;    
        }    
    }
	
    
}    

来让我们看下这四个方法的执行逻辑吧。


与其说本博客讲的是AutoCompleteTextView自动搜索数据库,不如说是CursorAdapter的原理。请原谅我标题党了,剩下的实例化的工作我就不写了。



写在最后:

计划一个月的时间写完这些教程的,但是中间发生了许多事,现在才完成,实属无奈。最近准备转行IT,投了很多简历,无人问津。一时间也不知道如何进入IT界,而且现在快过年了,工作确实不好找。趁现在还有点时间,准备做几个项目练练手,也算是投简历的资本吧。加油~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值