2017-10-02 15 views
-1

Cursor resultset=mydb.rawQuery("SELECT Name FROM Birds WHERE Size LIKE "+"'"+size+"'"+" AND Color1 LIKE "+"'"+color1+"'"+" AND Color2 LIKE "+"'"+color2+"'"+" AND Habitat LIKE "+"'"+habitat+"'"+";",null);どのようにアンドロイドプロジェクトのsqliteクエリで文字列変数を渡すには?

Cursor resultset=mydb.rawQuery("SELECT Name FROM Birds WHERE Size LIKE 'Duck%' AND Color1 LIKE 'Orange%' AND Color2 LIKE 'White%' AND Habitat LIKE 'Wetland%';",null);

Cursor resultset=mydb.rawQuery(sql,null); resultset.moveToFirst(); name=resultset.getString(0);

最初の文のカーソルの結果セットには、文字列変数名が含まれていますが、それはエラー - android.database.CursorIndexOutOfBoundExceptionを示しています。インデックス0 0

の大きさで、要求されました

2番目のステートメントCursor resultsetが実行されます。DuckはデータベースのSizeカラムの値です オレンジはColor1カラムの下の値ですデータベース にホワイトがデータベース

でカラー2列の下の値ですだから私は、文字列変数のサイズ、カラー1とカラー2が実際の値で更新取得されているので、それは実際に に動作しますので、最初のsqliteクエリを改善するために知りません。

答えて

2

試しましたか?

Cursor resultset=mydb.rawQuery("SELECT Name FROM Birds WHERE Size LIKE ? AND Color1 LIKE ? AND Color2 LIKE ? AND Habitat LIKE ?",null); 
String[] arguments= new String[]{"Duck%", "Orange%", "White%", "Wetland%"}; 
sqLiteDatabase.rawQuery(queryString, arguments); 

希望、これは最初のものが有効であるが、何の行を選択しない

0

カーソルが空であるため、境界問題のうちであり、次のしていることができます: -

Cursor resultset=mydb.rawQuery(sql,null); // OK 
resultset.moveToFirst(); // OK BUT WILL ALLOW EMPTY CURSOR 
name=resultset.getString(0); // OUT OF BOUNDS IF EMPTY CURSOR 

代わりに次のようなものを使用してください: -

Cursor resultset=mydb.rawQuery(sql,null); 
if (resultset.moveToFirst()) { 
    name=resultset.getString(0); 
} 

つまり、moveToFirstメソッドは、の移動を実行できるかどうかを示すブール値を返します。これは、移動が実際に実行されたかどうか、および処理される行が実際に存在するかどうかを確認する必要があります。

注!おそらく、行が返されないときの状況を処理する必要があります。

関連する問題