2014-09-19 111 views
0

我已經離開了java一段時間,並作爲一個熱身,決定運行一個基本的數據庫/清單應用程序,以幫助我跟蹤我需要的東西,因爲我移動。我基本上完成了應用程序,它大致運行但足以滿足我的目的,但是我在SQLite數據庫函數方面遇到了很多問題。我唯一需要解決的是「更新」功能。Android SQLite更新方法不會更新

這裏是我當前的代碼,我SQLITE Helper類中:

public int updateObject(HomeObject originalObject, HomeObject updatedObject) { 
    // 1. get reference to writable DB 
    SQLiteDatabase db = this.getWritableDatabase(); 

    // 2. create ContentValues to add key "column"/value 
    ContentValues values = new ContentValues(); 
    values.put("name", updatedObject.getName()); 
    values.put("room", updatedObject.getRoom()); // get title 
    values.put("have", updatedObject.getHave()); // get author 

    // 3. updating row 
    int i = db.update(TABLE_HomeObjects, //table 
      values, // column/value 
      KEY_ID+" = "+String.valueOf(originalObject.getId()), // selections 
      null); //selection args 

    // 4. close 
    db.close(); 

    return i; 
} 

然而,當我使用修改按鈕,這意味着調用此方法,並相應地更新對象,它似乎只是刪除目的。它從所有列表中消失,並且應用內搜索顯示它不再位於數據庫中。

這是我用來調用它相關的代碼如下所示:

MySQLiteHelper db = new MySQLiteHelper(this); 
Intent intent = getIntent(); 
String itemName = intent.getStringExtra(LivingRoom.EXTRA_MESSAGE); 

// Redacted... There is a large section of code here 
// which deals with pulling the newlyEditedName, newlyEditedHave, 
// and newlyEditedRoom variables from different places in the view. 

HomeObject newlyEditedObject = new HomeObject(newlyEditedName, newlyEditedHave, newlyEditedRoom); 
HomeObject originalObject = db.getObject(itemName); 
int test = db.updateObject(originalObject, newlyEditedObject); 

我很新的SQLite的,所以也許我失去了一些基本的東西......但什麼錯嗎?日誌顯示該方法返回「1」。作爲另一方面,我可以確認「getObject」方法完美工作,因爲它在此之前被多次使用,所以我知道它正確地返回。

謝謝你的幫助!如果我能解決這個問題,我可以開始使用這個東西。

回答

0

有兩種方法可以解決您的錯誤。 你可以更改您的代碼

int i = db.update(TABLE_HomeObjects, //table 
     values, // column/value 
     KEY_ID+" = '"+String.valueOf(originalObject.getId()) + "'", // selections 
     null); //selection args 

,或者你可以使用推薦的方法

int i = db.update(TABLE_HomeObjects, //table 
     values, // column/value 
     KEY_ID+" =?", // selections 
     new String[]{String.valueOf(originalObject.getId())}); //selection args 
+0

我更新了我的代碼(在嘗試使用這兩種方法),但它仍然給了我同樣的問題。目前,我已將它設置爲後者(這是來自我正在使用的教程的編碼),但它仍然在做同樣的事情。 – 2014-09-20 07:51:08

+0

對不起,延遲迴復。你能寫一個測試函數來運行查詢並檢查你的更新行包含什麼?而不是在數據庫中搜索更新的對象,是否可以使用該特定的KEY_ID檢查並打印更新的行所包含的內容? 這可能有助於追蹤。 – 2014-09-22 11:12:47

+0

另外我只是注意到這一點,但爲什麼你在你的函數結束時關閉你的數據庫?應用程序尚未運行時,您不應關閉數據庫。當你想要終止你的應用程序時關閉它。這可能會導致你的錯誤 – 2014-09-22 11:14:34