2012-03-02 70 views
0

我有一組項目負責其各自的數據庫表。Android onUpgrade()失敗,因爲數據庫被鎖定,我該怎麼做不同?

每個表管理類包含下面獲取連接的模式CRUD方法,運行CRUD操作,關閉連接:鎖定

public class PersonManager { 

    SQLiteDatabase db; 
    DbAdapter dbAdapter; //This is a subclass of SQLiteOpenHelper 

    public void addPerson(Person person) 
    { 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put("email", person.email); 
     contentValues.put("first_name", person.firstName); 

     db = dbAdapter.getWritableDatabase(); 
     db.insert("person", null, contentValues); 
     db.close(); 
    } 

    ...other crud/utility methods omitted... 
} 

現在,我通過onUpgrade()升級我的數據庫,我碰到數據庫的問題。

確切的錯誤信息如下:

CREATE TABLE android_metadata failed 
Failed to setLocale() when constructing, closing the database 
android.database.sqlite.SQLiteException: database is locked 

看來,onUpgrade要麼意味着:

1 run db.execSQL() calls or 
2 use helper classes that use onUpgrade()'s SQLiteDatabase rather than their own 

這將是更容易使用我的表管理類中onUpgrade數據遷移( )比db.execSQL()語句,或者重寫所有的CRUD方法以使用onUpgrade()的SQLiteDatabase。

我能正確設置我的數據庫訪問嗎?如果上面的代碼遵循正確的模式,我應該怎麼做才能解決這個問題?

謝謝!

+0

我以前遇到過這個問題。只有幾個問題可以幫助縮小範圍,你是否正在執行任何線程化,並且在此實例中是SQLiteOpenHelper的單例嗎?應該只有一個訪問點(http://stackoverflow.com/a/3689883/429047)。 – 2012-03-02 11:32:12

+0

我有一個擴展SQLiteOpenHelper的類。我實例化這個類而不是返回一個靜態實例。我不確定是否可以將一個Context引用傳遞給單引號,以防引用消失。我還打開並關閉每個CRUD方法的連接。 – Shellum 2012-03-02 17:09:22

+0

我不明白爲什麼它升級失敗的具體表 - 升級之前android_metadata應該存在。你能從你的助手發佈你的onUpgrade方法嗎? – 2012-03-02 23:43:47

回答

1

我沒有得到任何答案,所以我問了一個開發環聊。

根據Android開發者環聊團隊的說法,onUpgrade僅用於結構變更,而不適用於數據遷移/操作。

2

這是你的問題:

db = dbAdapter.getWritableDatabase(); 

當您在onUpgrade()的時候,你必須使用SQLiteDatabase搞定onUpgrade()爲您提供。所以,你的解決方案是重寫addPerson的功能,需要多一個參數 - 一個SQLiteDatabase手柄:

public void addPerson(Person person, SQLiteDatabase db) {...} 

如果您需要在您的項目中其他地方打電話addPerson的(),然後讓你的當前addPerson的(人的人)函數,是否這樣做 db = dbAdapter.getWritableDatabase() 調用,並將db傳遞給addPerson()的雙參數版本。