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分钟!别担心。您不需要添加嵌套事务。通过有一个外部事务,所有插入都可以工作,或者全部失败。