1

データベースの更新の問題をまだ解決できません。

私のアプリケーションには、2 つのアクティビティで定義された 2 つのリストがあります。リスト A には位置とリスト B の項目があります。両方のリストのデータがデータベースに保存され、データベースからアップロードされます。コードからわかるように、削除に問題はありません。

リスト A の位置を削除すると、この位置に属するリスト B のアイテムのセットも削除されます。

更新には問題があります。削除されたアイテムの後のアイテムのセットは自動インクリメントされるはずですが、削除されたアイテムの後の最初の行でのみ機能し、他のアイテムは変更されません。

これが私のコードです:

public void deleteItemsFromProduct(long nomer) {

    cursor = DataSource.queryAllinItems();

    if (cursor != null) {

        String [] pat = new String[] { String.valueOf(nomer) }; 
        db.delete(DBHelper.TABLE_ITEMS, DBHelper.COLUMN_NOMER + "=?", pat);


    for (int i=0; i<cursor.getCount(); i++){            
    ContentValues cv = new ContentValues();
    cv.put(DBHelper.COLUMN_NOMER, nomer);

    pat = new String[] { String.valueOf(nomer+1) };

    int updCount = db.update(DBHelper.TABLE_ITEMS, cv, DBHelper.COLUMN_NOMER + "=?", pat);

    Log.d(LOG_TAG, "updated rows count = " + updCount); 
    }           


    if (cursor.moveToFirst()) {

        Log.d(LOG_TAG, "--- Left in the table for items and prices: ---");

        idColIndex = cursor.getColumnIndex(DBHelper.COLUMN_ITEM_ID);
        nameColIndex = cursor.getColumnIndex(DBHelper.COLUMN_ITEM);
        priceColIndex = cursor.getColumnIndex(DBHelper.COLUMN_PRICE);
        nomerColIndex = cursor.getColumnIndex(DBHelper.COLUMN_NOMER);

        do {
            Log.d(LOG_TAG, "item id = " 
            + cursor.getInt(idColIndex)
            + ", item name = "
            + cursor.getString(nameColIndex)
            + ", item price = "
            + cursor.getInt(priceColIndex)
            + ", product nomer = "
            + cursor.getInt(nomerColIndex));

        } while (cursor.moveToNext());
    } else {
        Log.d(LOG_TAG, "Cursor is null");

        cursor.close();

        }
    }

そしてここにログ

11-07 14:37:49.862: D/(1813): item id = 89, item name = б, item price = 0, product nomer = 0
11-07 14:37:49.862: D/(1813): item id = 90, item name = т, item price = 1, product nomer = 1
11-07 14:37:49.922: D/(1813): item id = 91, item name = м, item price = 2, product nomer = 2
11-07 14:37:58.442: D/(1813): MainActivity: onResume()
11-07 14:38:05.382: D/(1813): --- Delete from table for products: ---
11-07 14:38:05.465: D/(1813): deleted row id = 72, name = х, image = /mnt/sdcard/download/sliced-bread-icon.png
11-07 14:38:05.712: D/(1813): updated rows count = 1
11-07 14:38:05.752: D/(1813): updated rows count = 0
11-07 14:38:05.752: D/(1813): --- Left in the table for items and prices: ---
11-07 14:38:05.804: D/(1813): item id = 90, item name = т, item price = 1, product nomer = 1
11-07 14:38:05.822: D/(1813): item id = 91, item name = м, item price = 2, product nomer = 2
11-07 14:38:10.416: D/(1813): MainActivity: onPause()
11-07 14:38:10.622: D/(1813): ChildActivity: onCreate()
11-07 14:38:10.723: D/(1813): item id = 90, item name = т, item price = 1, product nomer = 0

ID 72 の製品を削除すると、リスト A (nomer 0) の最初に残ります。ID 89 のリスト B のアイテムも削除されます。id=90 のアイテムは、その親がリスト A の最初の位置にあるため、nomer=0 を取得します。ただし、id=91 のアイテムは nomer=2 のままですが、nomer=1 にする必要があります。したがって、自動インクリメントは削除後の次のアイテムに対してのみ機能し、他のすべてのアイテムは変更されません。

4

2 に答える 2

0

私が思ったように、解決策はsqlitelingvoの十分な知識とプログラミングロジックの間にあります。

`           for (int i = 0; i <= cursor.getCount(); i++) {

                ContentValues cv = new ContentValues();

                cv.put(DBHelper.COLUMN_NOMER, nomer + i);

                int updCount = db.update(DBHelper.TABLE_ITEMS, cv,
                        DBHelper.COLUMN_NOMER + "=?",
                        new String[] { String.valueOf((nomer + i) + 1) });

                Log.d(LOG_TAG, "updated rows count = " + updCount);
            }
`

したがって、((nomer + i)+ 1)のすべてのアイテムの値を(nomer + i)に変更します。

于 2012-11-08T09:31:34.013 に答える
0

このコードでは:

db.update(..., DBHelper.COLUMN_NOMER + "=?", pat);

パラメータは文字列ですが、列の値は数値であるため、等しいとは比較されません。
(すべてのパラメーターを強制的に文字列にするのは、Android SQLite API の設計上のバグです)。

パラメータの型が正しいことを確認するには、次のようなものを使用します。

db.update(..., DBHelper.COLUMN_NOMER + "= CAST(? AS INTEGER)", pat);
于 2012-11-07T16:06:12.677 に答える