我有一組項目負責其各自的數據庫表。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。
我能正確設置我的數據庫訪問嗎?如果上面的代碼遵循正確的模式,我應該怎麼做才能解決這個問題?
謝謝!
我以前遇到過這個問題。只有幾個問題可以幫助縮小範圍,你是否正在執行任何線程化,並且在此實例中是SQLiteOpenHelper的單例嗎?應該只有一個訪問點(http://stackoverflow.com/a/3689883/429047)。 – 2012-03-02 11:32:12
我有一個擴展SQLiteOpenHelper的類。我實例化這個類而不是返回一個靜態實例。我不確定是否可以將一個Context引用傳遞給單引號,以防引用消失。我還打開並關閉每個CRUD方法的連接。 – Shellum 2012-03-02 17:09:22
我不明白爲什麼它升級失敗的具體表 - 升級之前android_metadata應該存在。你能從你的助手發佈你的onUpgrade方法嗎? – 2012-03-02 23:43:47