如何处理SQLite和Android的交易?

时间:2016-01-09 23:42:51

标签: java android sqlite transactions android-sqlite

我尝试在我的应用程序中包含事务,因为在数据库中写入非常慢,我看到herehere交易是一种解决方案,但它们仍然让我很困惑。

我有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)。 我做错了什么,拜托?感谢。

1 个答案:

答案 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)
}