GreenDao 多表事務操作


場景:Android APP多表操作事務管理

使用Android自帶的sql操作類操作的時候需要手動處理事務,使用GreenDao的時候不用管了,啥都處理好了。但是,如果是多表操作的話,怎么統一管理事務?

關鍵思想是事務嵌套,具體方法使用:

DaoSession().callInTx()

  

看源碼可以知道callInTx里面有一層事務管理,實際調用insert、update之類的具體方法的時候,里面還有一層事務。進行事務嵌套后,只要內層的事務有一個操作失敗,最外層的事務就認為整個事務都失敗,其他操作就回滾了。

以下是示例代碼:

public class TransactionTest {
    static String TAG = TransactionTest.class.getName();

    // DaoManager是我自定義的類
    public static boolean a(final long id1, final long id2) {
        try {
            // 還有一個runInTx的方法, 跟callInTx的區別是沒返回值. 根據實際情況自由選擇就行.
            return DaoManager.getDaoSession().callInTx(new Callable<Boolean>() {
                @Override
                public Boolean call() {
                    TableDao tableDao = DaoManager.getDaoSession().getTableDao();
                    TableAreaDao tableAreaDao = DaoManager.getDaoSession().getTableAreaDao();
                    Table table = new Table();
                    table.setId(id1);    // id主鍵, 第二次調用肯定主鍵沖突, 導致異常
                    table.setTable_name("測試桌台 @atearsan");
                    tableDao.insert(table);

                    TableArea area = new TableArea();
                    area.setId(id2);
                    area.setArea_name("測試區域 @atearsan");
                    tableAreaDao.insert(area);

                    return true;
                }
            });
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            return false;
        }
    }

    public static boolean b(final long id1, final long id2) {
        try {
            TableDao tableDao = DaoManager.getDaoSession().getTableDao();
            TableAreaDao tableAreaDao = DaoManager.getDaoSession().getTableAreaDao();
            Table table = new Table();
            table.setId(id1);
            table.setTable_name("測試桌台 @atearsan");
            tableDao.insert(table);

            TableArea area = new TableArea();
            area.setId(id2);
            area.setArea_name("測試區域 @atearsan");
            tableAreaDao.insert(area);
            return true;
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            return false;
        }
    }

    public static void test() {
        boolean a = a(1, 2); // true
        Log.e(TAG, "a: " + a);
        /*
        執行上面代碼: 數據庫寫入兩條數據
         */

        boolean b = b(2, 2);// false, 打印異常日志
        Log.e(TAG, "b: " + b);
        /*
        執行上面代碼: Table插入數據, TableArea id沖突, 寫入失敗
         */

        boolean c = a(3, 2);// false
        Log.e(TAG, "c: " + c);
        /*
        執行上面代碼: Table id不會沖突, TableArea id沖突, 但是數據庫不會寫入數據
         */
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM