
从上一个例子(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联合的例子所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)