2014-04-05 2 views
0

searchView를 사용하여 문자열로 데이터베이스를 검색하는 쿼리를 얻으려고하면 커서가 null로 반환되지만 비어 있습니다.검색 SQLite 데이터베이스가 빈 커서를 반환합니다.

@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는 Databasetaking의 검색 방법은 위의 방법에서 문자열 쿼리 :

/* 
    * 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 

호출

은 (SearchView.OnQueryTextListener를 구현하는 ListActivity 인) 내 검색 활동에서 검색하기

다른 코드는 빈 커서 반환 여기 실행하는 경우 :

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

모든 의견을 환영합니다! 대신이의 인 Ciaran

+1

'String selection = database.KEY_TESTNAME + "LIKE?"; 문자열이 [] selectionArgs = 새 문자열 [] { "%"+ 쿼리 + "%"} 문제가있는 곳을 알기 만하면 – Tarun

답변

0


이있어, 난이 curosr.rawQuery에 잘못된 매개 변수를 전달 된 것 같다(). 나는 데이터베이스 도우미 개체 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

2

:

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

둘 다 시도했지만 0 행 13 열의 커서가 계속 나타납니다. 디버거에서 커서를 볼 때 SQLiteQuery가 표시됩니다. SELECT * FROM WHERE (이름이 비슷합니까?)에서 테스트합니다. ListAdpter가이 커서로 설정되면 전체 데이터베이스가 표시됩니다. – dancingbush

+0

새 커서에서 새 어댑터로 setListAdpter (adp)를 호출 한 후 검색에서 새 커서가 반환 되더라도 nCreate() 메서드는 다시 호출하여 모든 결과를 기증하는 커서가있는 원래의 Adpter를 호출합니다. – dancingbush

+1

0 행을 검색하여 쿼리가 잘못되었거나 항목을 올바르게 선택하지 않은 경우. 선택한 쿼리가 올바른지 확인하십시오. –

관련 문제