2013-01-06 53 views
2

我有一個包含設備有相似的類型,製造商和型號和設備ID名作列表的表什麼行後更新數據庫中的行。另一個稱爲系統的表使用設備ID來指向設備的表格。我有一個編輯系統函數,我試圖讓我可以在系統表的記錄中編輯設備ID字段,以更改我指向的設備表中的哪個設備。我運行更新命令,它看起來應該工作,但行不會更新。有誰知道我做錯了什麼?安卓:無法決定我需要更新

這是我的更新代碼例程。

SQLiteDatabase db = dbHelper.getWritableDatabase(); 
String UpdateDeviceName = txtEditDeviceName.getText().toString(); 
String UpdateDeviceIP = txtEditDeviceIP.getText().toString(); 
//get the new device id based off of the three spinner values 
String dbQuery = "SELECT * FROM " + dbHelper.Devices_Table + ";"; 
Cursor c = db.rawQuery(dbQuery, null); 
if (c.getCount() > 0) 
{ 
    while (c.moveToNext()) 
    { 
     int iColumnID = c.getColumnIndex(dbHelper.Attribute_Device_ID); 
     int iColumnDeviceType = c.getColumnIndex(dbHelper.Attribute_Device_Type); 
     int iColumnDeviceManufacturer = c.getColumnIndex(dbHelper.Attribute_Device_Manufacturer); 
     int iColumnDeviceModel = c.getColumnIndex(dbHelper.Attribute_Device_Model); 
     String CheckDeviceType = c.getString(iColumnDeviceType); 
     if (CheckDeviceType.equals(DeviceType)) 
     { 
      String CheckDeviceManufacturer = c.getString(iColumnDeviceManufacturer); 
      if (CheckDeviceManufacturer.equals(DeviceManufacturer)) 
      { 
       String CheckDeviceModel = c.getString(iColumnDeviceModel); 
       if (CheckDeviceModel.equals(DeviceModel)) 
       { 
        DeviceID = c.getString(iColumnID); 
       } 
      } 
     } 
     } 
} 
db.close(); 
c.close(); 
db = dbHelper.getWritableDatabase(); 
//with the device ID update the system 
dbQuery = "UPDATE " + dbHelper.System_Table + " SET " + dbHelper.Attribute_Device_ID + " = " + DeviceID + ", " + 
    dbHelper.Attribute_Device_Name + " = '" + UpdateDeviceName + "', " + 
    dbHelper.Attribute_Device_IP + " = '" + 
    UpdateDeviceIP + "' WHERE " + dbHelper.Attribute_Device_ID + " = " + OrginalDeviceID + ";"; 
c = db.rawQuery(dbQuery, null); 
Log.d("Database Dump", "Edit Device Query: " + dbQuery); 
c.close(); 
db.close(); 

回答

1

我找到了答案。首先我要感謝Henry和Wolfram Rittmeyer。你們在哪裏非常有幫助。 :)

無論出於何種原因,Android的SQLite不喜歡使用UPDATE語句中原始的SQL查詢形式。在研究Wolfram Rittmeyer關於updateWithConflict所說的內容時,我在dbHelper擴展的SQLiteOpenHelper對象中找到了update方法。當我切換到該方法時,我能夠更新數據庫。我的地點條件已擴展到包括設備名稱,以便在系統具有多個設備製造商和相同類型的型號且只有一個設備名稱必須更改的情況下。

爲了參考的工作代碼來更新數據庫如下。我只發佈代碼的更改部分。 if(c.getCount()> 0)塊中的所有內容都不變。

c.close(); 
dbHelper.close(); 
db = dbHelper.getWritableDatabase(); 
//with the device ID update the system 
ContentValues values = new ContentValues(); 
values.put(dbHelper.Attribute_Device_ID, DeviceID); 
values.put(dbHelper.Attribute_Device_Name, UpdateDeviceName); 
values.put(dbHelper.Attribute_Device_IP, UpdateDeviceIP); 
String Where = dbHelper.Attribute_Device_ID + " = " + OrginalDeviceID + " AND " + dbHelper.Attribute_Device_Name + " = '" + OrginalDeviceName + "'"; 
db.update(dbHelper.System_Table, values, Where, null); 
c.close(); 
dbHelper.close(); 
finish(); //this exits the activity and goes back to the calling activity 
+0

如果你認爲亨利和我的回答很有幫助,那麼你應該加註他們。這就是StackOverflow的工作原理。 –

+1

我現在不能這樣做,因爲它說我需要15個聲望點,但我會盡快得到積分。 :) – Daisy

+0

現在你有足夠的積分。 –

1

您的搜索後關閉DB:

db.close(); 

離開了這一行,因爲DB助手代碼寧願保持DB打開,直到它不再使用(使用dbHelper.close()關閉DB當你完成它)。

更新後也是如此。

+0

我刪除了db.close();從例程,但它仍然沒有更新。 – Daisy

+0

你在logcat中遇到任何錯誤嗎?如果是,請發佈。 – Henry

+1

不,我不知道。我的logCat部分也設置爲冗長。 此處還有更新語句正在解析的內容。它看起來正確。 的DBQuery \t 「UPDATE SET系統DEVICE_ID = 6,設備名稱= '測試接收機',Device_IP = '192.168.1.125' WHERE DEVICE_ID = 7;」 – Daisy

1

所有任何rawQuery聲明首先不能包含尾隨分號!請參閱SQLiteDatabase的文檔。

此外,您總是必須在關閉數據庫之前關閉遊標。而你關閉數據庫,當你得到一個新的每個查詢。否則系統在稍後的某個時刻會拋出異常。雖然這些只會被記錄下來並且不會導致強制關閉,但您仍然應該關心適當的資源管理。

最後,你應該使用updateWithOnConflict法而不是使用CONFLICT_REPLACE作爲conflictAlgorithm。這隻會忽略任何UNIQUE約束並覆蓋衝突的行。所以要小心。如果您不想覆蓋現有的行,您必須確保違反常規不會導致您的問題。

+1

我試着關閉遊標,然後關閉分貝。但它仍未更新該行。我很茫然。我不明白爲什麼命令沒有執行。 – Daisy

+0

這只是三點之一。你有沒有關注其他人(追蹤「;」和'updateWithOnConflict')?你能解釋一下數據結構嗎?並且請發佈logcat摘錄(即使您認爲沒有什麼可以看到的),包括由'updateWithOnConflict'方法返回的更新行數的日誌語句。 –