¿Cómo puedo implementar autocompletar con cursoradapter?
Tengo una base de datos de SQLite que contiene 2 tablas 4000 + filas cada uno usado para el autocomplete. Vi ejemplos muy simples que utilizan una matriz de cadenas para proporcionar autocompletar o utilizan la lista de contactos para hacer lo mismo. Obviamente ninguno de estos trabajos en mi caso. ¿Cómo puedo usar mi propia base de datos SQLite con mis propios datos de autocompletar, para el autocompletado. ¿Tengo que crear proveedores de contenido? ¿Cómo? Por favor, dame algunos ejemplos porque no pude encontrar ninguno. He conseguido sobreescribir SQLiteOpenHelper
para copiar la base de datos de la carpeta de activos a la carpeta / data / data / MY_PACKAGE / databases / en el android. He creado un CursorAdapter
personalizado que utiliza mi personalizado SQLiteOpenHelper
y devuelve un cursor de runQueryOnBackgroundThread
. Consigo errores extraños sobre alguna columna del _id que falta. He añadido la columna _id a mis tablas. También no entiendo qué está haciendo la interfaz de Filterable y cuándo se filtran mis datos. ¿Qué métodos / clases necesito anular? Gracias.
- SQLiteDiskIOException: error de E / S de disco (código 3850)
- Cómo implementar SQLCipher cuando se utiliza SQLiteOpenHelper
- Android SQCipher ¿Necesito cerrar la base de datos?
- IllegalArgumentException: el valor de enlace en el índice 1 es nulo
- El manejo de la base de datos dejó de funcionar en Android 2.2.1 (Desire HD 1.72.405.3)
- ¿Cómo actualizar una base de datos SQLite y NO perder todos los datos existentes?
- Bucle a través de un Cursor SQLite lleva demasiado tiempo
- SQLiteOpenHelper - ¿Cómo se crea la base de datos?
- GUID de Android: clave principal
- SQLiteOpenHelper vs ContentProvider
- Android SQLite Rendimiento con índices
- Cómo escribir contiene consulta en SQLite fts3 fulltext search
- SQLITE - configuración de la versión de una nueva base de datos
Funciona.
Necesitas el SQLiteOpenHelper desde aquí . Básicamente tiene que copiar su base de datos en una carpeta específica de su carpeta de activos. Entonces usted necesita un CursorAdapter personalizado que utiliza su SQLiteOpenHelper personalizado.
Aquí está el método onCreate para mi actividad.
@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); }
Aquí está el cursoradapter. Puede pasar nulo al cursor cuando construya.
public class KeywordsCursorAdapter extends CursorAdapter { private Context context; public KeywordsCursorAdapter(Context context, Cursor c) { super(context, c); this.context = context; } //I store the autocomplete text view in a layout xml. @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); } //you need to override this to return the string value when //selecting an item from the autocomplete suggestions //just do cursor.getstring(whatevercolumn); @Override public CharSequence convertToString(Cursor cursor) { //return super.convertToString(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) { //return super.runQueryOnBackgroundThread(constraint); String filter = ""; if (constraint == null) filter = ""; else filter = constraint.toString(); //I have 2 DB-s and the one I use depends on user preference SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); //String selectedCountryCode = prefs.getString("selectedCountry", "GB"); String selectedCountryCode = prefs.getString(context.getString(R.string.settings_selected_country), "GB"); selectedCountryCode += ""; //Here i have a static SQLiteOpenHelper instance that returns a cursor. Cursor cursor = MyApplication.getDbHelpers().get(selectedCountryCode.toLowerCase()).getKeywordsCursor(filter); return cursor; } }
Aquí está la parte que devuelve el cursor: es sólo una selección con una condición similar.
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; } ... }
También puede crear un proveedor de contenido personalizado, pero en este caso sería sólo otra clase inútil que necesita anular.
- Mostrar mensaje en el primer inicio después de la instalación
- Confundido con removeAllViewsInLayout (), postInvalidate () y refreshDrawableState ()