1

複数のテーブルでデータを検索しようとしています.where条件データが最初のテーブル(tab1)に存在しない場合、2番目のテーブル(tab2)で検索する必要がありますが、それを示す例外が発生しています

範囲外のカーソル インデックス例外: サイズ 0 でインデックス -1 が要求されました

これが私のコードです

SQLiteDatabase db=openOrCreateDatabase("train",SQLiteDatabase.CREATE_IF_NECESSARY, null);
Cursor c1;
String[] table={"tab1","tab2","tab3","tab4"};
int i=0;
do {
   c1 = db.rawQuery("select * from '"+table[i]+"' where name='Triplicane'", null);
i++;    

} while(c1 == null);

int id1=c1.getInt(0);
String nam1=c1.getString(1);
Toast.makeText(fare.this,"ID no:"+id1, Toast.LENGTH_LONG).show();       
Toast.makeText(fare.this,"name"+nam1, Toast.LENGTH_LONG).show();
4

3 に答える 3

10

だから最初から。暗黙的に、各カーソルは最初の行の前に配置されるため、それを操作する場合は呼び出す必要があります

cursor.moveToFirst()

空でない場合はカーソルを最初の行に移動し、作業の準備が整います。Cursor が空の場合、単純にfalseを返します。ですから、このメソッドは、カーソルが有効かどうかを示す非常に便利なインジケーターです。

そして、私の推奨事項として、コードを変更することをお勧めします。これは、壊れていると思われ、「スパゲッティコード」のように聞こえるためです。

Cursor c = null;
String[] tables = {"tab1", "tab2", "tab3", "tab4"};
for (String table: tables) {
   String query = "select * from '" + table + "' where name = 'Triplicane'";
   c = db.rawQuery(query, null);
   if (c != null) {
      if (c.moveToFirst()) { // if Cursor is not empty
         int id = c.getInt(0);
         String name = c.getString(1);
         Toast.makeText(fare.this, "ID: " + id, Toast.LENGTH_LONG).show();       
         Toast.makeText(fare.this, "Name: " + name, Toast.LENGTH_LONG).show();
      }
      else {
         // Cursor is empty
      }
   }
   else {
      // Cursor is null
   }
}    

ノート:

今、私はあなたにいくつかの提案をしたいと思います:

  • パラメーター化されたステートメントを使用することは非常に優れた方法であるため、将来、ステートメントを使用する場合はプレースホルダーを使用してください。そうすれば、あなたのステートメントはより人間が読めるようになり、より安全にSQL Injectionなり、より速くなります。

  • また、列名、テーブル名などを保持する静的な最終フィールドを作成し、 getColumnIndex(<columnName>)メソッドを使用して非常に悪い検索を行う「タイプミス」を回避することも非常に良い方法です。

于 2013-03-30T14:01:59.847 に答える
0

Cursor flag to empty row 、Sqliteカーソルが行番号 -1 を指している場合、使用するc.moveNext()か、「行ごとc.moveToFirst()に」行を読み取ることができます

于 2013-03-30T14:53:44.247 に答える
0

cursor.movetoFirst()カーソルからデータを取得する前に書き込み ます。

于 2013-03-30T14:56:39.237 に答える