0

主なアクティビティでは、アプリ データベースが存在するかどうかにかかわらず、アプリがいつ開かれるかを確認しようとしています。これは、最初の実行時にのみ、データベースを作成し、必要なすべてのレコードを挿入する機会を得たいためです。

しかし、それは私とはうまくいきません。このエラーが表示されます:

..原因: アンドロイド。データベース。CursorindexOutOfBoundsException: サイズ 0 のインデックス 0 が要求されました

私の最初の考えは、上記の例外/エラーは SQLiteException ではないか、何が欠けているのか正確にはわかりません。

これが私のコードです:

    DBAdapter dbCheck = new DBAdapter(this);
    boolean dbStatus;
    String strData;
    try { 
        dbCheck.open(); 
        Cursor tblCheck = dbCheck.getThis_tblData(10); //get record no 10 - random number
        strData = tblCheck.getString(5);   // get the value of a field in the table
        tblCheck.close();
        dbCheck.close();
        System.out.println("<---> Db found ");
    } catch (SQLiteException e) { 
        //database doesn't exist yet. Create it.
        System.out.println("<---> Db not found ");
    Intent MakeDB = new Intent(MainActivity.this, com.kjsoft.tre.InsertData.class);
    StartActivity(MakeDB);
    } 

助けてくれてありがとう!

4

2 に答える 2

0

この特定の例外はジェネリックCursorクラスで発生するため、SQLiteException.

catchナンバリが言ったよう に、ステートメントの型を変更することもできますが、 SQLiteOpenHelper クラス を作成して、DB の作成 (およびアプリが変更された場合は更新) を管理することをお勧めします。

于 2012-10-01T15:32:11.573 に答える
0

コード内の次の行を置き換えます。

Cursor tblCheck = dbCheck.getThis_tblData(10);

次のように:

Cursor tblCheck = dbCheck.getThis_tblData(10);
if ((tblCheck != null) && (tblCheck.getCount() > 0)) {
    tblCheck.moveToNext();
    strData = tblCheck.getString(5);
}

カーソルの初期位置は常に最初の行の直前にあるため、次のステップ (最初の行) に移動してからデータにアクセスする必要があります。もちろん、null でないかどうかを確認する必要があります。

于 2012-10-02T10:20:41.713 に答える