2011年9月27日 星期二

Android學習_getWritableDatabase called recursively.

如果有在Android裡面使用SQLite,都會知道要複寫兩個方法,onCreate與onUpgrade,若是希望程式安裝時,資料庫裡面就已經有一些預設值,那麼我們就會想在onCreate裡面insert需要的資料;但這時很有可能會碰到一個錯誤訊息:java.lang.IllegalStateException: getWritableDatabase called recursively.。

原因:在onCreate若要取得SQLiteDatabase的不能使用getWritableDatabase的方法。

解法:觀察onCreate方法中,已經預設傳入SQLiteDatabase,所以在onCreate方法內可以直接使用,而不需要另外取得。

原本的Insert

public long insert(String table, String fields[], String values[])
{
SQLiteDatabase db = this.getWritableDatabase();
/* 將新增的值放入ContentValues */
ContentValues cv = new ContentValues();
for (int i = 0; i < fields.length; i++)
{
cv.put(fields[i], values[i]);
}
return db.insert(table, null, cv);
}

於onCreate中使用的Insert

public long insertDefault(SQLiteDatabase db,String table, String fields[], String values[])
{
ContentValues cv = new ContentValues();
for (int i = 0; i < fields.length; i++)
{
cv.put(fields[i], values[i]);
}
return db.insert(table, null, cv);
}


差別也就只在於SQLiteDatabase的取得。

3 則留言:

匿名 提到...

你好,我是初學者我想請問,我有個實驗室要將手機讀取到的數值以TextView顯示數值在手機,並用InternalStorage(內部儲存)方法來儲存,也能夠存了(也是以textview方式顯示在下面出來);但我想要例如第一次讀到的值就存到第一個TextView(有多個能存),第2次讀到的值就存到第2個,不要都存在同一個textview,請問有甚麼辦法ㄇ(我不要用其他資料庫儲存),因為最後要將存完的資料一個一個抓出來設定其他動作所以不能都在同一個textview顯示,請問有辦法ㄇ?

ola的家 提到...

必須在你所謂Internal Storage的檔案內,儲存有辦法識別"第幾個值"的資料格式,再在進行讀取時放置到正確的位置(你說的TextView)。

看起來你似乎已經可以儲存跟讀取了?那能否把正確的值放到正確的位置也只是判斷式的操作而已。

匿名 提到...

恩恩,的確能夠讀取及儲存了只差要怎麼將每次讀到的值分別(第一次讀到的除到第一個textview,第二次就存到第2個),但是都是暗下一個同意個按鈕去讀取值,然後另一個按鈕負責除到手機並顯示;目前就差在如何分別儲存而不是存在同一個地方一直增加,但我一直想不出來怎麼弄,請問有沒有類似的例子或城市之類的讓我參考呢,網路我也查過很多了但是一直找不到相關的

張貼留言