0

私はデータベースを試していますが、ヘルパークラスは使用していませんが、アクティビティ内でdb関数を追加しました。私は得られた行から列を選択しようとしているときに、範囲外のエラーが発生しました。カーソルインデックスの範囲外のエラー

具体

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1エラー。

MainActivity

public class MainActivity extends AppCompatActivity { 

SQLiteDatabase db; 
private EditText foldernameEditText; 
private ListView folderlistview; 
private TextView mEmptyStateTextView; 
ListViewCursorAdapter listViewCursorAdapter; 
final String mfoldertable = "foldertable"; 
final String mtitletable = "titletable"; 
TextView transfer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    db = openOrCreateDatabase("mainDB", Context.MODE_PRIVATE, null); 
    db.execSQL("CREATE TABLE IF NOT EXISTS " + mfoldertable + "(_id integer primary key autoincrement, folder text collate NOCASE, UNIQUE(folder))"); 
    db.execSQL("CREATE TABLE IF NOT EXISTS "+mtitletable+ "(_id integer primary key autoincrement,id1 integer, title text, FOREIGN KEY(id1) REFERENCES "+mfoldertable+"(_id))"); 
    //db.execSQL("Drop table "+mfoldertable+""); 
    //db.execSQL("Drop table "+mtitletable+""); 
    Cursor c = db.rawQuery("SELECT * FROM " + mfoldertable + "", null); 
    listViewCursorAdapter = new ListViewCursorAdapter(this, c); 
    folderlistview = (ListView) findViewById(R.id.folderlistview); 
    mEmptyStateTextView = (TextView) findViewById(R.id.empty_view); 
    folderlistview.setAdapter(listViewCursorAdapter); 
    folderlistview.setEmptyView(mEmptyStateTextView); 
    foldernameEditText = (EditText) findViewById(R.id.foldername); 
    Button enterFolderButton = (Button) findViewById(R.id.enterFolderButton); 
    enterFolderButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      try { 
       db.execSQL("INSERT INTO "+mfoldertable+"(folder) VALUES('"+ foldernameEditText.getText().toString() +"')"); 
      } catch (SQLiteConstraintException exception) { 
       Toast.makeText(getApplicationContext(), "This folder already exists", Toast.LENGTH_SHORT).show(); 
      } 
      foldernameEditText.setText(""); 
      Cursor d = db.rawQuery("SELECT * FROM " + mfoldertable + "", null); 
      listViewCursorAdapter.swapCursor(d); 
     } 
    }); 

    folderlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Intent intent = new Intent(MainActivity.this, TitleList.class); 
      Bundle bundle = new Bundle(); 
      transfer = (TextView) view.findViewById(R.id.list_item_folder_text_view); 
      String stuff = transfer.getText().toString(); 
      bundle.putString("hello", stuff); 
      Cursor f=db.rawQuery("SELECT * FROM "+mfoldertable+" where folder='"+stuff+'"",null); 
      //Log.e("helloerror",f.getString(f.getColumnIndexOrThrow("_id"))); 
      bundle.putInt("int",f.getInt(f.getColumnIndexOrThrow("_id"))); 

      //bundle.putInt("int",1); 
      intent.putExtras(bundle); 
      startActivity(intent); 
     } 
    }); 
} 

}

カーソルfはエラーを指すラインです。理由を理解できません。自動インクリメント変数は、入力したフォルダの横にある適切なテキストビューに正しく表示されますが、取得できません。

答えて

0

android.database.CursorIndexOutOfBoundsException

この例外は、無効なインデックスを持つカーソルにアクセスしようとしていることを示しています。カーソルオブジェクトを取得するとすぐにmoveToFirst()メソッドを呼び出していることを確認してください。これは、カーソルにデータがあるかどうかを示す論理値を返し、データがある場合はカーソルを最初の要素に設定します。

これを置き換えます。これにより

bundle.putInt("int",f.getInt(f.getColumnIndexOrThrow("_id"))); 

を:

if (f != null && f.moveToFirst()) { 
     bundle.putInt("int",f.getInt(f.getColumnIndexOrThrow("_id"))); 
} 

をさらにヘルプが必要な場合は、この回答を参照してください:あなたは答えが役に立ったと評価していた場合android.database.CursorIndexOutOfBoundsException

+0

がアップ投票を行います。 :) –

関連する問題