自动补全与sqlite联合的例子

自动补全与sqlite联合的例子,第1张

概述        从上一个例子(Android自动补全教程)可以看到自动补全是很简单的, 今天再深入一点,ArrayAdapter提供的字符串从数据库中查询,并且使用MultiAutoCompleteTextView控件。 此控件和AutoCompleteTextView的最大区别是可以补全多个词,看名字就能知道,呵呵。 效果如下,每个词中间用逗号分割。 首先 布局和上一个例子相同。 创建一个名为l

从上一个例子(Android自动补全教程)可以看到自动补全是很简单的,

今天再深入一点,ArrayAdapter提供的字符串从数据库中查询,并且使用MultiautoCompleteTextVIEw控件。

此控件和autoCompleteTextVIEw的最大区别是可以补全多个词,看名字就能知道,呵呵。

效果如下,每个词中间用逗号分割。


首先

布局和上一个例子相同。

创建一个名为List_item.xml的XML文件并把它保存在res/layout/文件夹下。编辑文件像下面这样:

<?xml version="1.0" enCoding="utf-8"?>  <TextVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID"      androID:layout_wIDth="fill_parent"      androID:layout_height="fill_parent"      androID:padding="10dp"      androID:textSize="16sp"      androID:textcolor="#000">  </TextVIEw> 

这个文件定义了一个简单的TextVIEw来显示提示列表的每一项。

打开res/layout/main.xml文件加入如下内容:

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:layout_wIDth="fill_parent"    androID:layout_height="fill_parent"    androID:orIEntation="vertical" >    <TextVIEw        androID:ID="@+ID/tv"        androID:layout_wIDth="fill_parent"        androID:layout_height="wrap_content"        androID:text="@string/hello" />	<MultiautoCompleteTextVIEw 	    androID:ID="@+ID/mactv"        androID:layout_wIDth="fill_parent"        androID:layout_height="wrap_content"	    /></linearLayout>
下面就来设计我的数据库,名字为person,要建一个person表,有两个字段:name和gender。

新建一个sqliteHelper类,继承自sqliteOpenHelper:

package com.linc.autosqlite.dao;import androID.content.Context;import androID.database.Cursor;import androID.database.sqlite.sqliteDatabase;import androID.database.sqlite.sqliteOpenHelper;/** * 实现对表的创建、更新、变更列名 *** 作 * @author lincyang * */public class sqliteHelper extends sqliteOpenHelper {	public static final String DB_name = "person";	public static final int DB_VERSION = 1;	protected static Context ctx;	//	//构造函数一:传context	//	public sqliteHelper(Context context) {		super(context,DB_name,null,DB_VERSION);		ctx = context;	}	//	//构造函数二	//	public sqliteHelper() {		super(ctx,DB_VERSION);	}		@OverrIDe	public voID onCreate(sqliteDatabase db) {		String sql = "create table person(name varchar(20) not null," +				"gender varchar(10) not null );";		db.execsql(sql);	}		@OverrIDe	public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {		// Todo auto-generated method stub			}    protected voID closeCursor(Cursor cursor) {        if (cursor != null) {            cursor.close();        }    }}
这样,构造的时候就为你创建数据库了,在onCreate的时候,数据库的表也建好了。
我又创建一个新类autosqliteDAO来专门负责处理数据库相关逻辑和事务:
package com.linc.autosqlite.dao;import java.util.ArrayList;import androID.content.ContentValues;import androID.content.Context;import androID.database.Cursor;import androID.database.sqlite.sqliteDatabase;import androID.util.Log;import com.linc.autosqlite.Meta.Person;public class autosqliteDAO extends sqliteHelper {	public autosqliteDAO(Context context)	{		super(context);	}	/**	 * 用contentValues来插入数据	 * 这是AndroID独有的办法,如果你没有sql经验直接学习AndroID,	 * 那么这种方法是适合你的	 * @param name	 * @param gender	 */	public voID insertPerson(String name,String gender)	{		sqliteDatabase db = getReadableDatabase();				ContentValues cv = new ContentValues();		cv.put("name",name);		cv.put("gender",gender); 		db.insert("person",cv);		db.close();	}	/**	 * 用执行SQL语句来插入数据,注意占位符的用法	 * 其实这两种办法都不错,如果你善于用SQL语句,说明你有这方面的经验,就用这种方法吧	 * @param name	 * @param gender	 */	public voID insertPerson2(String name,String gender)	{		sqliteDatabase db = getReadableDatabase();				String sql = "INSERT INTO person(name,gender) VALUES (?,?)";		db.execsql(sql,new Object[]{name,gender});		db.close();	}		public voID deletePerson(String name)	{		sqliteDatabase db = getReadableDatabase();		String whereClause = "name=?";//删除的条件		String[] whereArgs = {name};//删除的条件参数		db.delete("user",whereClause,whereArgs);		db.close();	}	public voID deletePerson2(String name)	{		sqliteDatabase db = getReadableDatabase();		String sql = "DELETE FROM person WHERE name = ?";		db.execsql(sql,new Object[]{name});//执行SQL语句		db.close();	}		public voID updatePerson(String name,String gender)	{		sqliteDatabase db = getReadableDatabase();		ContentValues cv = new ContentValues();		cv.put("gender",gender);		String whereClause = "name=?";		String[] whereArgs = {name};		db.update("user",cv,whereArgs);		db.close();	}	public voID updatePerson2(String name,String gender)	{		sqliteDatabase db = getReadableDatabase();		String sql = "UPDATE [person] SET gender = ? WHERE name = ?";		db.execsql(sql,new Object[]{gender,name});		db.close();	}	/**	 * query的参数很多,下面我列出的应该很容易看懂:	 * table:第一个是表名 	 * columns:第二个是要查询的列名,一个数组。	 * selection:第三个是条件,用?占位	 * selectionArgs:第四个是条件参数,数组	 * groupBy:第五个是分组	 * having:第六个是having,筛选满足条件的组	 * orderBy:第七个是按递增或递减顺序排序	 * limit:第八个是限制返回记录的区域	 * @param name	 * @return	 */	public ArrayList<Person> queryPerson(String name)	{        Cursor cursor = null;        ArrayList<Person> personList = new ArrayList<Person>();        try {            sqliteDatabase db = getReadableDatabase();            cursor = db.query("person",new String[]{"name","gender"},"name = ?",new String[]{name},null);            Person person;            while (cursor.movetoNext()) {            	String personname = cursor.getString(0);            	String personGender = cursor.getString(1);            	person = new Person(personname,personGender);            	personList.add(person);            }            db.close();        }        catch(Exception ex)        {        	Log.i("linc","queryPerson------ex is  " +ex.getMessage());        }        finally {            closeCursor(cursor);        }        return personList;	}	public ArrayList<String> queryPerson()	{        Cursor cursor = null;        ArrayList<String> nameList = new ArrayList<String>();        String sql = "SELECT * FROM person ";        try {            sqliteDatabase db = getReadableDatabase();            cursor = db.rawquery(sql,null);            while (cursor.movetoNext()) {            	String personname = cursor.getString(0);            	nameList.add(personname);            }            db.close();        }        catch(Exception ex)        {        	Log.i("linc","queryPerson------ex is  " +ex.getMessage());        }        finally {            closeCursor(cursor);        }        return nameList;	}	public ArrayList<Person> queryPerson2(String name)	{        Cursor cursor = null;        ArrayList<Person> personList = new ArrayList<Person>();        String sql = "SELECT * FROM person WHERE name = ?";        try {            sqliteDatabase db = getReadableDatabase();            cursor = db.rawquery(sql,new String[]{name});            Person person;            while (cursor.movetoNext()) {            	String personname = cursor.getString(0);            	String personGender = cursor.getString(1);            	person = new Person(personname,"queryPerson2------ex is  " +ex.getMessage());        }        finally {            closeCursor(cursor);        }        return personList;	}	public ArrayList<Person> queryPerson3(String name)	{        Cursor cursor = null;        ArrayList<Person> personList = new ArrayList<Person>();        String sql = "SELECT * FROM person WHERE name liKE ?";        try {            sqliteDatabase db = getReadableDatabase();            cursor = db.rawquery(sql,"queryPerson3------ex is  " +ex.getMessage());        }        finally {            closeCursor(cursor);        }        return personList;	}}
最后,在Activity开始时我插入了几条数据,那么在文本框中输入时就会自动补全了,就像上图一样。

Activity代码如下:

package com.linc.autosqlite;import java.util.ArrayList;import androID.app.Activity;import androID.os.Bundle;import androID.util.Log;import androID.Widget.ArrayAdapter;import androID.Widget.MultiautoCompleteTextVIEw;import com.linc.autosqlite.dao.autosqliteDAO;public class autosqliteTestActivity extends Activity {	private MultiautoCompleteTextVIEw mactv;	autosqliteDAO dao;    /** Called when the activity is first created. */    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.main);                mactv = (MultiautoCompleteTextVIEw)findVIEwByID(R.ID.mactv);        dao = new autosqliteDAO(this);        init();        ArrayList<String> nameList = dao.queryPerson();        Log.i("linc","List count is "+nameList.size());        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,androID.R.layout.simple_dropdown_item_1line,nameList);         mactv.setAdapter(adapter);        mactv.setThreshold(1);//从第一个字符开始补全,可选        mactv.setTokenizer(new MultiautoCompleteTextVIEw.CommaTokenizer());//必须设置的分隔符      }        private voID init()    {    	dao.insertPerson("张飞","male");    	dao.insertPerson("刘备","male");    	dao.insertPerson("孙尚香","female");    	dao.insertPerson("关羽","male");    	dao.insertPerson("liubei","male");    	dao.insertPerson("dongzhuo","male");    	dao.insertPerson("yuanshao","male");    }}
怎么样?是不是很简单? 总结

以上是内存溢出为你收集整理的自动补全与sqlite联合的例子全部内容,希望文章能够帮你解决自动补全与sqlite联合的例子所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1176380.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-02
下一篇2022-06-02

发表评论

登录后才能评论

评论列表(0条)

    保存