2010-11-13 56 views
5

我試圖熟悉Android及其數據庫API。 我創建了從SQLiteOpenHelper繼承的類,這 是我如何在數據庫中SQLiteDatabase.insertOrThrow不拋出,但沒有插入數據

@Override 
public void onCreate(SQLiteDatabase db) { 

    try { 
     db.execSQL("CREATE TABLE " + FUELS_TABLE_NAME + " (" 
       + "_ID INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + "DATE_OF_FUELS DATE DEFAULT CURRENT_TIME," 
       + "SELLER_POSITION TEXT DEFAULT 'unknown'," 
       + "AMOUNT REAL" 
       + ");" 
     ); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
    } 
} 

用於將數據添加到數據庫的函數來創建該表內 以下implemeneted同一類

public void addNewFuel(float amount) { 

    // Create the content to insert into the database 
    ContentValues newEntry = new ContentValues(); 
    newEntry.put("amount", amount); 

    // Get database handler 
    try { 
     db = getWritableDatabase(); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
     return; 
    } 

    // Begin transaction and insert data 
    long returnedValue; 
    db.beginTransaction(); 
    try { 
     returnedValue = db.insertOrThrow(FUELS_TABLE_NAME, null, newEntry); 
     Log.v(DATABASE_NAME, "return value " + returnedValue); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
    } finally { 
     db.endTransaction(); 
    } 

    db.close(); 
} 

但顯然沒有添加數據。 returnValue總是1.該方法不拋出, ,當我用adb拉出數據庫並查看它的內容完全是空的。

我只是不明白我錯過了什麼。

任何建議,將不勝感激。

感謝, 小號

回答

-3

見benritz的答案正確的解決方案。這個答案不正確,但很遺憾我無法刪除它,因爲它是一個已接受的帖子。

/******* 不正確!

由於您從SQLiteOpenHelper繼承,您對getWritableDatabase()的調用已經啓動了一個數據庫事務。從SQLiteOpenHelper API

使用事務,以確保 數據庫始終處於合理的 狀態。

因此,您無需撥打db.beginTransaction()db.endTransaction()。那些無關的事務調用正在搞亂你的插入。我將同樣的場景插入到我的項目中,發現使用這些事務方法時返回了相同的索引(在我的情況下爲6)。當我刪除電話,我得到我想要的結果(插入多個記錄)。

不正確! *******/

+1

非常感謝。現在它可以工作。我真的很想知道如何把事情弄糟,爲什麼插入不會拋出。無論如何,非常感謝! – emitrax 2010-11-13 17:49:04

+0

不客氣。我認爲不會拋出一個異常,因爲你的insert語句沒有什麼特別的錯誤,並且你沒有違反任何表約束等。相反,事情在多個事務調用中混合起來。我將不得不做更多的研究,以瞭解爲什麼嵌套事務的行爲方式如此。我明白爲什麼它不會插入任何東西,但事實上返回一個id是很奇怪的。 – McStretch 2010-11-13 17:56:56

+5

這真的很奇怪! SQLiteOpenHelper的源代碼當然不會打開除數據庫創建和更新之外的任何事務。所以在getWriteableDatabase()調用返回之後,沒有事務處於活動狀態的數據庫!要麼是真的很煩,要麼這個答案是假的。 – Nakedible 2011-05-08 09:46:55

29

McStretch的回答是錯誤的。 getWritableDatabase()不會爲您的代碼創建事務,文檔中的引用行指的是用於onCreate和onUpgrade方法的事務,這意味着您無需在這些方法中添加事務代碼。您仍然需要爲需要交易的任何其他方法添加交易代碼。

emitrax的代碼無法正常工作,因爲db.setTransactionSuccessful()未被調用,這意味着該事務將被回滾db.endTransaction()

+1

這樣做更有意義 – Bilthon 2012-10-26 03:58:59

+0

顯然,這是正確的答案,而不是McStretch的。 – lilbyrdie 2013-05-10 05:18:14

相關問題