2012-11-07 32 views
1

我仍然無法解決數據庫中更新的問題。更新SQLite數據庫中某個項目的ID

我的應用程序在兩個活動中定義了兩個列表。 列表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也被刪除。因爲其父母在列表A中佔據第一位置,所以id = 90的項目獲得nomer = 0。但是id = 91的項目保持nomer = 2,但它應該是nomer = 1。所以,自動增量只適用於刪除後的下一個項目,其他所有項目保持不變。

+0

爲什麼你需要更新ID? ID不應該改變。 –

+0

實際上它不是關於更新id。我已經鏈接了兩個變量nomer的列表。 AdapterView.AdapterContextMenuInfo acmi =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();當你點擊列表的第一個位置時,nomer是acmi.id – user1706819

+0

對於列表B中屬於這個位置的所有項目,acmi.id = 0變爲nomer = 0。所以,當我刪除列表A中的位置時, B中0以下的所有項目也被刪除。但問題在於更新。我可以更新下一行,但其他人保持不變。 – user1706819

回答

0

在此代碼:

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

的參數是一個字符串,但在列中的值是數字,所以他們絕不會比較相等。
(強制所有的參數設置字符串是Android的SQLite API的設計錯誤。)

爲了確保參數的正確類型,使用這樣的:

db.update(..., DBHelper.COLUMN_NOMER + "= CAST(? AS INTEGER)", pat); 
+0

讓我試着回來。 – user1706819

+0

已經嘗試過,沒有工作。不知道該怎麼做。 – user1706819

+0

我覺得在編程方面存在問題。可能我的做法是錯誤的? – user1706819

0

因爲我認爲解決之道在於之間sqlite的Lingvo的和編程的好knoweledge logic.Here是:

`   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)的值。