0

データベースが空の場合、またはデータベースが作成されたばかりの場合、このエラーが発生します。

03-10 17:34:40.758:E / AndroidRuntime(1144):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {com.example.adressbooktake2 / com.example.adressbooktake2.MainActivity}:android.database.CursorIndexOutOfBoundsException:インデックス0が要求され、サイズは0

これが私のメインクラスのコードです。

public class MainActivity extends Activity {
    DBAdaptor db;   
    Cursor cursor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        db = new DBAdaptor(this).open();        
        cursor = db.getAllRecords();

        DisplayRecord(cursor);

}

次に、DBAdaptorクラスでこのコードを呼び出します。

    public Cursor getAllRecords() 

    {       
        Cursor gaRecords = db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
                        KEY_PHONENUMBER, KEY_EMAIL}, null, null, null, null, null);     


        gaRecords.moveToFirst();

        return gaRecords;

    }

}

問題は、データベースが作成されたばかりのとき、データがないため、moveToFirst()が移動する場所がないことだと思います。しかし、ストックされたデータベースがある場合はmoveToFirst()が必要なので、これを回避する方法がわかりません。

誰かが解決策を見ますか?問題を正しく診断しましたか?

4

3 に答える 3

1

次のように、空の Cursor を確認できます。

...
cursor = db.getAllRecords();
if(cursor.getCount() > 0)
    DisplayRecords(cursor);
else
    DisplayNoRecordsMessage();

または、前の質問に投稿DisplayRecords()したので、次も使用できます。

...
if (c != null && !cursor.isAfterLast())
{
    nameTxt.setText(c.getString(1));
    phoneTxt.setText(c.getString(2));
    emailTxt.setText(c.getString(3));
}

また、メソッド名は小文字で開始する必要があるというJava 命名規則についてもお読みください。

于 2013-03-10T17:48:15.583 に答える
0

Cursor.moveToFirst() は、カーソルが空の場合に false を返します。

ドキュメントを参照してください: http://developer.android.com/reference/android/database/Cursor.html#moveToFirst()

問題は DisplayRecord() にあると思います。

DisplayRecord() でカーソルからデータを取得していますか? その場合、その内部でカーソルにデータが含まれているかどうかを確認し、たとえばmoveToFirstを呼び出してその結果を確認する必要があります。

何かのようなもの

private void DisplayRecord(Cursor c){
    if(!c.moveToFirst()){
         return;
    }
    // do stuff
}
于 2013-03-10T17:50:08.497 に答える
0

if(cursor .moveToFirst()) を使用してカーソルを確認します

public class MainActivity extends Activity {
    DBAdaptor db;   
    Cursor cursor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        db = new DBAdaptor(this).open();        
        cursor = db.getAllRecords();

        if(cursor.moveToFirst()){
           DisplayRecord(cursor);
            }


}
于 2013-03-10T17:51:40.240 に答える