它可以工作。
您需要来自这里的SQLiteOpenHelper。您基本上需要将您的数据库从assets文件夹复制到特定文件夹中。然后,您需要一个使用您自定义的SQLiteOpenHelper的自定义CursorAdapter。
这是我的活动的onCreate方法。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
KeywordsCursorAdapter kwadapter = new KeywordsCursorAdapter(this, null);
txtKeyword = (AutoCompleteTextView)this.findViewById(R.id.txtKeyword);
txtKeyword.setAdapter(kwadapter);
txtCity = (AutoCompleteTextView)this.findViewById(R.id.txtCity);
btnSearch = (Button)this.findViewById(R.id.btnSearch);
btnSearch.setOnClickListener(this);
}
这是一个游标适配器。在构造时,当传入null时,表示不使用游标。
public class KeywordsCursorAdapter extends CursorAdapter {
private Context context;
public KeywordsCursorAdapter(Context context, Cursor c) {
super(context, c);
this.context = context;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.keyword_autocomplete, null);
return v;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String keyword = cursor.getString(cursor.getColumnIndex("keyword"));
TextView tv = (TextView)view.findViewById(R.id.txtAutocomplete);
tv.setText(keyword);
}
@Override
public CharSequence convertToString(Cursor cursor) {
String value = "";
switch (type) {
case Keywords:
value = cursor.getString(DatabaseHelper.KEYWORD_COLUMN);
break;
case Cities:
value = cursor.getString(DatabaseHelper.CITY_COLUMN);
break;
}
return value;
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
String filter = "";
if (constraint == null) filter = "";
else
filter = constraint.toString();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String selectedCountryCode = prefs.getString(context.getString(R.string.settings_selected_country), "GB");
selectedCountryCode += "";
Cursor cursor = MyApplication.getDbHelpers().get(selectedCountryCode.toLowerCase()).getKeywordsCursor(filter);
return cursor;
}
}
这里是返回光标的部分:它只是一个带有类似条件的选择器。
public class DatabaseHelper extends SQLiteOpenHelper {
...
public synchronized Cursor getKeywordsCursor (String prefix) {
if (database == null) database = this.getReadableDatabase();
String[] columns = {"_id", "keyword"};
String[] args = {prefix};
Cursor cursor;
cursor = database.query("keywords", columns, "keyword like '' || ? || '%'", args, null, null, "keyword", "40");
int idcol = cursor.getColumnIndexOrThrow("_id");
int kwcol = cursor.getColumnIndexOrThrow("keyword");
while(cursor.moveToNext()) {
int id = cursor.getInt(idcol);
String kw = cursor.getString(kwcol);
Log.i("keyword", kw);
}
cursor.moveToPosition(-1);
return cursor;
}
...
}
您也可以创建自定义内容提供程序,但在这种情况下,它只是另一个无用的类,您需要覆盖它。
?
代表参数,||
表示连接符。我不确定如何将参数转换为字符串,因此我使用空字符串进行连接。正确应该是? || '%'
。 - gyozo kudorrunQueryOnBackgroundThread
并返回一个新的游标。是的,我可能应该重用游标,但我很高兴终于让它工作了,我没有进行优化。 - gyozo kudor