¿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.

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.

  • Problema con SQL Query Android Where Clause
  • SQLite Eliminar Cascade no funciona
  • AutoCompleteTextView con CursorLoader y SimpleCursorAdapter
  • La forma más rápida de buscar a través de cadenas almacenadas en la base de datos sqlite
  • Android SQLite Facilidad de reversión de transacciones?
  • Longitud máxima de Android Sqlite String?
  • Android - SimpleCursorAdapter.ViewBinder - Establecer el color de fondo
  • Expandablelistview extiende simplecursoradapter para poblar desde sqlite
  • Cómo utilizar FTS3 en SQLite
  • java.lang.IllegalStateException: getWritableDatabase llamado recursivamente
  • ¿JSON en un campo del sqlite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.