我尝试在我的应用程序中包含事务,因为在数据库中写入非常慢,我看到here和here交易是一种解决方案,但它们仍然让我很困惑。
我有Schedule
个包含对象LineStation
的对象,我想使用事务在数据库中写入它们。
这里是我的类addSchedules
中的方法ScheduleDAO
,它将所有计划写入数据库。它只包含一个事务。
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
调用,并且不包含交易,因为它是嵌套的&#34;在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)。
我做错了什么,拜托?感谢。
答案 0 :(得分:1)
问题是跨多个数据库连接不能存在数据库事务。在addLineStation方法中,当您应该使用在addSchedules中创建的连接时,您将打开第二个数据库连接。
您需要将SQLiteDatabase数据库对象传递给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)
}