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);
}
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
@pskink cela m'a mis dans la bonne direction, cependant, j'ai rencontré quelques autres problèmes auxquels je vais mettre à jour ma question –
appel 'sqlitedb.rawQuery' – pskink