-1

以下のデータベース ハンドラ ファイルから特定の削除機能を使用したいと考えています。

関数の削除 ( DatabaseHandler ファイル内):

// Deleting single contact
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?",new String[] { String.valueOf(contact.getID()) });
    db.close();
}

私が別の活動でそれを実装しているとき。このような:

String a = Integer.toString(_contactlist.get(position).getID());
            viewHolder.txtid.setText(a.trim());
            viewHolder.txt_name.setText(_contactlist.get(position).getName().trim());
            viewHolder.txt_phone.setText(_contactlist.get(position).getPhoneNumber().trim());

final int temp = position;

Contact pm = db.getContact(temp); //temp is the position of the contact
    db.deleteContact(pm);

しかし、これを使用していると、予期しないエラーが発生します。

ログキャット:

08-19 19:21:25.468: W/System.err(304): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
08-19 19:21:25.468: W/System.err(304):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
08-19 19:21:25.468: W/System.err(304):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
08-19 19:21:25.468: W/System.err(304):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
08-19 19:21:25.468: W/System.err(304):  at com.parth.targetthebudget.DatabaseHandler.getContact(DatabaseHandler.java:80)
08-19 19:21:25.468: W/System.err(304):  at com.parth.targetthebudget.ViewContact$ListAdapter$2$1.onClick(ViewContact.java:149)
08-19 19:21:25.468: W/System.err(304):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163)
08-19 19:21:25.468: W/System.err(304):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 19:21:25.468: W/System.err(304):  at android.os.Looper.loop(Looper.java:130)
08-19 19:21:25.468: W/System.err(304):  at android.app.ActivityThread.main(ActivityThread.java:3687)
08-19 19:21:25.468: W/System.err(304):  at java.lang.reflect.Method.invokeNative(Native Method)
08-19 19:21:25.468: W/System.err(304):  at java.lang.reflect.Method.invoke(Method.java:507)
08-19 19:21:25.468: W/System.err(304):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
08-19 19:21:25.468: W/System.err(304):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
08-19 19:21:25.468: W/System.err(304):  at dalvik.system.NativeStart.main(Native Method)

問題:

その中には 1 つのデータしか残っていません。最後のデータはまったく削除されていませんが、上記のエラーが表示されています

編集(getContact(); メソッド) :

// Getting single contact
    Contact getContact(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();

        Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));
        // return contact
        return contact;
}
4

1 に答える 1

0

Cursor#moveToFirst()何らかの理由でブール値を返します。false の場合、これはCursorが最初の位置に移動できないことを意味します (ほとんどの場合、要素がないため)。しかし、あなたはこの戻り値をチェックしてやっていません

Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));

もちろん、空のCursorIndexOutOfBoundsException場合は失敗します。Cursorまた、 をSQLiteDatabase#query()返さないnullため、null ポインターのチェックは必要ありません。

    Contact contact = null;
    if (cursor.moveToFirst()) {
        contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2));
    }
    return contact;

補足として、常に括弧を使用します{}。複数の頭痛の種から解放されます。古いコードでは、NPE を発生させるnull であってもCursor( )にアクセスすることに注意してくださいcursor.getString(0)(幸運にもSQLiteDatabase#query()が返されませんでした)。null

于 2013-08-19T14:20:26.467 に答える