簡體   English   中英

如何使用SQLite和Android處理事務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM