【问题标题】:Search SQLite database returns empty cursor搜索 SQLite 数据库返回空游标
【发布时间】:2014-04-05 20:34:31
【问题描述】:

我正在使用 searchView 获取查询以使用字符串搜索数据库,光标不返回为 null 而是为空。

从我的搜索活动(实现 SearchView.OnQueryTextListener 的 ListActivity)中调用搜索:

@Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        //handleIntent(intent);
        Log.d("LIST ACTIVITY SEARCH", "onQueryTextCahanged called: "+ newText);
        Cursor c = data.getWordMatches(newText, null);

        Log.d("LISTACTIVITY", "CURSOR QUERY ROWS/COLS = "+ c.getCount()+" "+c.getColumnCount());

        //now set bind cursor data to list view using custim ItemAdpter class
        adapter = new ItemAdapter(ViewListOfTests.this, c);
        this.setListAdapter(adapter);
        return false;
    }

SQLite 数据库中的搜索方法采用上述方法中的字符串查询:

/*
     * methods to search database with String query form searchable widget intent 
    *  in ViewListOfDives ListActivity search bar. Each search returns a cursor which is set to adpter
    *  in ViewListOfYesys List Activity
    */

    public Cursor getWordMatches(String query, String[] columns){

        String selection = database.KEY_TESTNAME + " MATCH ?";
        String[] selectionArgs = new String[] {query+"*"}; //wildcard *

        return query(selection, selectionArgs, columns);


    }//end getWordMatches



    private Cursor query(String selection, String[] selectionArgs,
            String[] columns) {

        // return cursor form params passed getWordMatches(Styring query) from search widget ListActivity

        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables(DATABASE_TABLE);

        dbHelperObject = new DbHelper(ourContext);

        Cursor cursor = builder.query(dbHelperObject.getReadableDatabase(), columns, selection, selectionArgs, null, null, null);

        if(cursor == null){
            return null;
        }else if(!cursor.moveToFirst()){
            cursor.close();
            return null;
        }

        return cursor;




    }//end query

这里执行的 else if 代码返回一个空光标:

else if(!cursor.moveToFirst()){
                cursor.close();
                return null;

任何意见表示赞赏! 夏兰

【问题讨论】:

  • 尝试String selection = database.KEY_TESTNAME + " LIKE ?"; String[] selectionArgs = new String[] {"%"+query+"%"}; 只是为了知道问题出在哪里

标签: android sqlite search


【解决方案1】:

而不是这个:

if(cursor == null){
    return null;
}else if(!cursor.moveToFirst()){
cursor.close();
   return null;
}

return cursor;


使用这个:

if(cursor == null){
    return null;
}else{
     cursor.moveToFirst();
}

return cursor;

【讨论】:

  • 两者都试过了,不断得到一个 0 行 13 列的游标。在调试器中查看光标时,我看到 SQLiteQuery: SELECT * FROM tests WHERE (name LIKE ?)。当使用此光标设置 ListAdpter 时,将显示整个数据库..
  • 虽然从搜索中返回了一个新的游标,但在我使用新游标中的新适配器调用 setListAdpter(adp) 后,似乎再次调用了 nCreate() 方法,因此调用了原来的 Adpter用光标捐赠所有结果
  • 如果您检索到 0 行因此您的查询是错误的,或者您没有正确选择您的项目。确保您的选择查询是正确的。
【解决方案2】:

知道了,看来我向 curosr.rawQuery() 传递了错误的参数。 我正在将 ref 传递给数据库助手对象 getReadableDB 调用:

Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);

当我用数据库对象替换这个参数时,它工作正常:

SQLiteDatabase ourDataBase = ourDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

Cursor cursor = builder.query(ourDataBase, columns, selection, selectionArgs, null, null, null);

所述的培训文档通过了以前的 mDatabaseOpenHelper.getReadableDatabase() 但这似乎不起作用,而不是为什么。http://developer.android.com/training/search/search.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多