Java 如何使用SQLite和Android处理事务?
我尝试在我的应用程序中包含事务,因为在数据库中编写非常慢,我看到事务是一个解决方案,但它们仍然让我非常困惑 我有Java 如何使用SQLite和Android处理事务?,java,android,sqlite,transactions,android-sqlite,Java,Android,Sqlite,Transactions,Android Sqlite,我尝试在我的应用程序中包含事务,因为在数据库中编写非常慢,我看到事务是一个解决方案,但它们仍然让我非常困惑 我有计划对象,其中包含对象线路站,我希望使用事务将它们写入数据库 这里是我的类ScheduleDAO中的方法addSchedules,该方法将所有计划写入数据库。它只包含一个事务 public void addSchedules(ArrayList<Schedule> schedulesList) { SQLiteDatabase db = this.dh.getWri
计划
对象,其中包含对象线路站
,我希望使用事务将它们写入数据库
这里是我的类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();
}
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)。
请问我做错了什么?谢谢。问题是数据库事务不能跨多个数据库连接存在。在addLineStation方法中,当您应该使用addSchedules中创建的数据库连接时,您正在打开第二个数据库连接 您需要将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)
}
我认为这是因为您得到了另一个数据库对象(
getWriteableDatabase()
),重用同一个实例应该可以解决这个问题。谢谢!SQLiteDatabaseLockedException已消失。我还向LineStation添加了一个嵌套事务,它可以完美地工作!30秒而不是之前的3分钟!别担心。您不需要添加嵌套事务。通过有一个外部事务,所有插入都可以工作,或者全部失败。