2017-01-06 2 views
0

Je AutoComplete ai deux AutoCompleteTextViews qui sont remplis avec des données de base de données SQLite. Je tire des informations à partir d'un serveur ERP et le stocker localement dans la base de données SQLite et alimenter le textview comme dans ceci:Comment puis-je améliorer la recherche dans un widget texte

equipment = (AutoCompleteTextView) findViewById(R.id.equipmentAutoCompleteTextView); 
    if(equipment.getText().toString().length() == 0){ 
     equipment.setError("Equipment is required"); 
    } 
    FieldInstallationDB sqlitedb1 = new FieldInstallationDB(this); 
    sqlitedb1.openForRead(); 

    String[] items = sqlitedb.getAllItemNames(); 

    for(int i = 0; i < items.length; i++) 
    { 
     Log.i(this.toString(), items[i]); 
    } 

    ArrayAdapter<String> adapter1 = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, items); 
    equipment.setAdapter(adapter1); 
    equipment.setThreshold(1); 

Et ici:

customerName = (AutoCompleteTextView) findViewById(R.id.customerNameAutoCompleteTextView); 
    if(customerName.getText().toString().length() == 0){ 
     customerName.setError("Customer Name is required"); 
    } 
    FieldInstallationDB sqlitedb = new FieldInstallationDB(this); 
    sqlitedb.openForRead(); 

    String[] accounts = sqlitedb.getAllCustNames(); 

    for(int i = 0; i < accounts.length; i++) 
    { 
     Log.i(this.toString(), accounts[i]); 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, accounts); 
    customerName.setAdapter(adapter); 
    customerName.setThreshold(1); 

En supposant que j'ai ces:

  • Cuillère noire
  • Cuillère rouge
  • Cuillerée

Et je commence typying « spo », je veux voir les trois éléments énumérés à faire une sélection. Au lieu de cela, je reçois seulement "Spoonful" à venir. Comment l'obtenir pour reconnaître et afficher toutes les instances (éléments) qui ont les lettres "spo"?

MISE À JOUR:

Après le premier commentaire à ma question, je lis d'autres articles et mis à jour mon code pour ressembler à ceci:

equipment = (AutoCompleteTextView) findViewById(R.id.equipmentAutoCompleteTextView); 
    if(equipment.getText().toString().length() == 0){ 
     equipment.setError("Equipment is required"); 
    } 
    FieldInstallationDB sqlitedb1 = new FieldInstallationDB(this); 
    sqlitedb1.openForRead(); 

    String[] items = sqlitedb1.getAllItemNames(); 

    for(int i = 0; i < items.length; i++) 
    { 
     Log.i(this.toString(), items[i]); 
    } 

    equipment.setThreshold(1); 


    SimpleCursorAdapter itemNameAdapter = new SimpleCursorAdapter(
      this, android.R.layout.simple_dropdown_item_1line, null, items, toView, 0); 



    itemNameAdapter.setFilterQueryProvider(new FilterQueryProvider() { 

     public Cursor runQuery(CharSequence constraint) { 
      return suggestItemCompletions(constraint); 
     } 
    }); 

itemNameAdapter.setCursorToStringConverter(new SimpleCursorAdapter.CursorToStringConverter() { 
     public CharSequence convertToString(Cursor cur) { 
      int index = cur.getColumnIndex(FieldInstallationDB.ITEM_NAME); 
      return cur.getString(index); 
     }}); 
    equipment.setAdapter(itemNameAdapter); 

Voici la méthode suggestitemcompletions écrite dans la classe d'activité :

public Cursor suggestItemCompletions(CharSequence str) { 

    return getContentResolver().query(null, new String[] {FieldInstallationDB.ITEM_NAME}, "(" + FieldInstallationDB.ITEM_NAME + " LIKE ? ", new String[] {"%" + str + "%"}, null); 

} 

Ceci suggère d'utiliser getContentResolver() ce qui n'a pas de sens dans mon cas puisque je suis accessi ng la base de données de mon application et non d'une autre application. Par conséquent, cela ne fonctionne pas car j'ai défini le paramètre URI sur null car ma table de base de données n'a pas d'URI. Toutefois, si je décide de ne pas utiliser getContentResolver() et d'interroger directement FieldInstallationDB, j'obtiens l'erreur à l'adresse .query() indiquant que la méthode ne peut pas être résolue.

MISE A JOUR II:

I utilisé rawQuery() comme l'a suggéré et cela fonctionne:

public Cursor suggestItemCompletions(CharSequence str) { 
    fieldInstDatabase = openForRead(); 
    String sql = "Select "+ ITEM_NAME+ " FROM "+ TABLE_EQUIPMENT+ " WHERE "+ ITEM_NAME + " LIKE ?"; 
    String[] selectArgs = new String[]{ "%" + str + "%"}; 

    return fieldInstDatabase.rawQuery(sql,selectArgs); 

} 

Cette méthode est dans ma classe db et je l'appelle l'activité principale ici:

itemNameAdapter.setFilterQueryProvider(new FilterQueryProvider() { 

     public Cursor runQuery(CharSequence constraint) { 
      return sqlitedb1.suggestItemCompletions(constraint); 
     } 
    }); 

Cela fonctionne sauf que j'obtiens une exception IllegalArgumentException ici:

01-10 13: 07: 08,792 5361-5361/com.example.sweetiean.stlfieldinstallation1 E/AndroidRuntime: EXCEPTION FATAL: principal processus: com.example.sweetiean.stlfieldinstallation1, PID: 5361 java.lang. IllegalArgumentException: colonne Sac (TypeC): 5900016009 'n'existe pas

ce qui est logique parce que « Sac (TypeC): 5900016009 » est pas une colonne, il est le premier élément de la colonne NOM dE l'éLÉMENT en la base de données.

Je ne sais pas pourquoi il lit le premier élément comme nom de colonne. J'ai essayé de débogage, mais je ne peux pas entrer dans

public Cursor runQuery(CharSequence constraint) { 
     return sqlitedb1.suggestItemCompletions(constraint); 
    } 
+0

utilisez 'SimpleCursorAdapter' et configurez son' FilterQueryProvider' comme [this] (http://stackoverflow.com/a/19860624/2252830), n'utilisez pas 'ArrayAdapter', bien sûr vous devez retourner votre base de données' Cursor 'de' runQuery' méthode – pskink

+0

@pskink cela m'a mis dans la bonne direction, cependant, j'ai rencontré quelques autres problèmes auxquels je vais mettre à jour ma question –

+0

appel 'sqlitedb.rawQuery' – pskink

Répondre

0

Comme suggéré dans les commentaires, un IllegalArgumentException se produit ici à cause du paramètre from dans mon SimpleCursorAdapter. Les paramètres from et to du SimpleCursorAdapter requièrent respectivement le nom de colonne de la table et la textview.

Dans mon cas, je peuplait le paramètre from avec un tableau de chaînes des articles que je recevais de la base de données:

String[] items = sqlitedb1.getAllItemNames(); 

for(int i = 0; i < items.length; i++) 
{ 
    Log.i(this.toString(), items[i]); 
} 

equipment.setThreshold(1); 


SimpleCursorAdapter itemNameAdapter = new SimpleCursorAdapter(
     this, android.R.layout.simple_dropdown_item_1line, null, items, toView, 0); 

Correction à:

SimpleCursorAdapter itemNameAdapter = new SimpleCursorAdapter(
     this, android.R.layout.simple_dropdown_item_1line, null, fromCol, toView, 0); 

Avec fromCol définis comme final static String[] fromCol = new String[] { FieldInstallationDB.ITEM_NAME }; l'a réparé.