【问题标题】:Search through SQLite database on Android Search在 Android 搜索上搜索 SQLite 数据库
【发布时间】:2012-04-14 17:46:58
【问题描述】:

在我的 ContentProvider 中导致错误的方法

public static Cursor getSuggestions(String query) {
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    db.beginTransaction();
    try {
        String selection = Formula.FORMULA_NAME + " LIKE %?%";
        String[] selectionArgs = { query + "*" };
        Cursor cursor = dbHelper.getReadableDatabase().query(
                FORMULA_TABLE_NAME,
                new String[] { BaseColumns._ID,
                        SearchManager.SUGGEST_COLUMN_TEXT_1, 
                        BaseColumns._ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID 
                        }, 
                        selection,
                selectionArgs, null, null, null);
        db.setTransactionSuccessful();
        return cursor;
    } catch (SQLiteException e) {
    } finally {
        db.endTransaction();
    }
    throw new SQLException("Failed to begin transaction");
}

数据库创建:

db.execSQL("CREATE TABLE " + FORMULA_TABLE_NAME + " (" +
                BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                SearchManager.SUGGEST_COLUMN_TEXT_1 + " TEXT," +
                Formula.CATEGORY + " TEXT" +
                ");");

使用的常量:

    public static final String FORMULA_NAME = SearchManager.SUGGEST_COLUMN_TEXT_1;
    public static final String CATEGORY = "category";

问题在于,在我的方法中,事务不成功,因为它引发错误:throw new SQLException("Failed to begin transaction"); 我正在尝试做的是在数据库中进行搜索,作为搜索的一部分。当用户激活搜索框时,我对其进行了设置,以便此方法应根据其名称返回带有可疑项目的光标。通过调试,我推断问题出在我的 Content Provider 内部的搜索方法上。有什么解决方案或想法吗?

【问题讨论】:

    标签: java android sqlite search


    【解决方案1】:

    我猜throw new SQLException("Failed to begin transaction"); 这行应该在你的catch 块内。

    如果我们将所有内容简化为:

    public static Cursor getSuggestions(String query) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String selection = Formula.FORMULA_NAME + " LIKE %?%";
        String[] selectionArgs = { query + "*" };
        Cursor cursor = db.query(
                FORMULA_TABLE_NAME,
                new String[] { BaseColumns._ID,
                        SearchManager.SUGGEST_COLUMN_TEXT_1, 
                        BaseColumns._ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID 
                        }, 
                selection,
                selectionArgs, null, null, null);
        return cursor;
    } 
    

    【讨论】:

    • 我明白了:04-14 15:29:18.264: W/SuggestionsAdapter(624): android.database.sqlite.SQLiteException: near "%": syntax error: ,编译时:SELECT _id ,Suggest_text_1,_id ASSuggest_intent_data_id FROM formula WHERESuggest_text_1 LIKE %?% 这意味着我的选择语句是错误的
    • 确实,我没有注意到这一点。这 ?单独使用,它只是从selectionArgs“剪切和粘贴”字符串的符号。你想要Formula.FORMULA_NAME + " LIKE ?"。 SQL通配符%表示“一个或多个不相关的字符”,它属于selectionArgs,例如{ query + "%" }