Ich möchte Vorschläge von meiner DB-Tabelle erhalten, während Sie SearchView verwenden.IllegalArgumentException: Ungültige Spalte - SEARCHVIEW
ich Illegal: Ungültige Spalte (Name der Spalte)
private static final HashMap<String, String> mColumnMap = buildColumnMap();
//Build a map for all columns that may be requested, which will be given to SQLiteQueryBuilder.
//This allow ContentProvider to request columns without the need to know real column names and
//create the alias itself
private static HashMap<String, String> buildColumnMap() {
HashMap<String, String> map = new HashMap<String, String>();
map.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "rowid AS " +
CookingContract.FoodEntry.COLUMN_NAME);
map.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "rowid AS " +
CookingContract.FoodEntry.COLUMN_DESCRIPTION);
map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + CookingContract.FoodEntry._ID);
return map;
}
//Return a Cursor over all words that match the given query
public Cursor getWordMatches(String query, String[] columns) {
String selection = CookingContract.FoodEntry.COLUMN_NAME + " LIKE ?";
String[] selectionArgs = new String[]{"%" + query + "%"};
return query(selection, selectionArgs, columns);
}
//The SQLiteBuilder provides a map for all possible columns requested to actual columns in the
//DB, creating a simple column alias mechanism by which the ContentProvider doesn't need to know
//the real column names
private Cursor query(String selection, String[] selectionArgs, String[] columns) {
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(CookingContract.FoodEntry.TABLE_NAME);
builder.setProjectionMap(mColumnMap);
Cursor cursor = builder.query(getReadableDatabase(),
columns, selection, selectionArgs, null, null, null);
if (cursor == null) {
return null;
} else if (!cursor.moveToFirst()) {
cursor.close();
return null;
}
return cursor;
}
}
Hier ist ein Teil des Codes meines Contentprovider ist
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor retCursor;
switch (sUriMatcher.match(uri)) {
case SEARCH_SUGGEST:
if (selectionArgs == null) {
throw new IllegalArgumentException(
"selectionArgs must be provided for the Uri: +"uri");
}
return getSuggestions(selectionArgs[0]);
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
retCursor.setNotificationUri(getContext().getContentResolver(), uri);
return retCursor;
}
private Cursor getSuggestions(String query) {
query = query.toLowerCase();
String[] columns = new String[]{
CookingContract.FoodEntry._ID,
CookingContract.FoodEntry.COLUMN_NAME,
CookingContract.FoodEntry.COLUMN_DESCRIPTION,
};
return cookingDBHelper.getWordMatches(query, columns);
}
Mit setProjectionMap ich soll in der Lage sein zu sagen, Android welchen Namen meine Spalten haben und unter Berücksichtigung der SearchManager-Einschränkungen ... Was mache ich falsch?
Ich bearbeitet meinen Code und jetzt bekomme ich die folgende Fehlermeldung: Suchvorschläge abfragen warf eine Ausnahme. 'android.database.sqlite.SQLiteException: keine solche Spalte: suggest_text_1 (Code 1):, beim Kompilieren: SELECT _id, suggest_text_1, suggest_text_2 FROM Essen WHERE (name LIKE?)' – Alex
Es funktioniert! Danke, das Problem war, wie du die Aliasnamen sagst – Alex