[英]How to handle transactions with SQLite and Android?
我嘗試將事務包含在我的應用程序中,因為在數據庫中寫入速度非常慢,我在這里和這里都看到了事務是一種解決方案,但它們仍然使我感到困惑。
我有包含對象LineStation
Schedule
對象,並且我想使用事務在數據庫中寫入它們。
在這里,我的類ScheduleDAO
的方法addSchedules
將所有計划寫入數據庫。 它僅包含一筆交易。
public void addSchedules(ArrayList<Schedule> schedulesList) {
SQLiteDatabase db = this.dh.getWritableDatabase();
db.beginTransactionNonExclusive();
for (Schedule schedule : schedulesList) {
ContentValues values = new ContentValues();
// insert linestation
LineStationDAO.getLineStationDAO().addLineStation(schedule.getLineStation());
values.put(/*...*/);
/* ... */
db.insert(DatabaseHandler.TABLE_SCHEDULE, null, values);
}
db.setTransactionSuccessful();
db.endTransaction();
db.close();
}
這是,該方法addLineStation
在我班上LineStationDAO
,節省對象LineStation
給出。 它由addSchedules
調用,並且不包含事務,因為它在addSchedules
事務中“嵌套”。
public void addLineStation(LineStation lineStation) {
SQLiteDatabase db = this.dh.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(/*...*/);
/* ... */
db.insert(DatabaseHandler.TABLE_LINE_STATION, null, values); // database is locked (code 5)
db.close();
}
LineStation
插入表示SQLiteDatabaseLockedException
(數據庫已鎖定-代碼5)。 請問我做錯了什么? 謝謝。
問題是數據庫事務不能跨多個數據庫連接存在。 在應該使用addSchedules中創建的數據庫連接時,在addLineStation方法中,您將打開第二個數據庫連接。
您需要像這樣將SQLiteDatabase db對象傳遞給addLineStation方法:
LineStationDAO.getLineStationDAO().addLineStation(db, schedule.getLineStation());
並更改此:
public void addLineStation(SQLiteDatabase db, LineStation lineStation) {
ContentValues values = new ContentValues();
values.put(/*...*/);
/* ... */
db.insert(DatabaseHandler.TABLE_LINE_STATION, null, values); // database is no longer locked (code 5)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.