2013-03-26 22 views
1

這裏是我的模型類,它使用ORMLITE在sqlite數據庫中保存。需要將數據庫滾回到以前的狀態

public class Site{ 
       ... 
       ... 
       Collection<Visit> visits; 
       } 

public class Visit{ 
       ... 
       ... 
       Collection<Pic> pics; 
       } 

public class Pic{ 
       ... 
       ... 

       } 

現在在一個視圖中我添加,編輯或從這三個表中刪除。我的視圖中有一個按鈕用於取消更改(添加,編輯,刪除)。所以我需要回滾到以前的db狀態。

我怎樣才能實現這回滾到三個表使用ormlite與android的某個狀態?

我在ormlite文檔大約DAO.SetAutoCommit()startThreadConnection()方法讀取。我想我可以通過使用這兩個來做到這一點。但不知道如何使用它們。請告訴我如何去做。

這裏是我的DBHelper類:

public class DatabaseHelper extends OrmLiteSqliteOpenHelper { 
// name of the database file 
private static final String DATABASE_NAME = "Test.db"; 


private static final int DATABASE_VERSION = 1; 

private Dao<Site, Integer> siteListDao = null; 
private Dao<Visit, Integer> visitDao= null; 
private Dao<Pic,Integer> picDao=null; 

    public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase database,ConnectionSource connectionSource) { 
    try { 
     TableUtils.createTable(connectionSource, Site.class); 
     TableUtils.createTable(connectionSource, Visit.class); 
     TableUtils.createTable(connectionSource, Pic.class); 
       } catch (SQLException e) { 
     Log.e(DatabaseHelper.class.getName(), "Can't create database", e); 
     throw new RuntimeException(e); 
    } catch (java.sql.SQLException e) { 
     e.printStackTrace(); 
    } 

} 

    public Dao<Visit, Integer> getVisitDao() { 
    if (null == visitDao) { 
     try { 
      visitDao = getDao(Visit.class); 
     }catch (java.sql.SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
    return visitDao; 
} 
    ..... 
    ..... 

回答

1

是的,我大部分都認同@Stefan。我認爲你需要在你的應用程序中執行此操作,而不是依賴數據庫結構讓所有人返回到以前的狀態。

關閉自動提交(其中ORMLite使用Sqlite下的交易)或直接使用交易是而不是如何做到這一點。事務旨在允許您對數據庫進行多項更改,然後在數據庫更改失敗時將它們全部回滾。它們不打算保持等待用戶輸入的秒數。

  • 你可以在你的數據一個堅定的布爾字段或一些這樣更容易通過刪除所有對象「恢復」的數據庫,其中committed = false或一些這樣的。
  • 您可以擁有單獨的表格,以便將對象存儲到會話表中,然後在用戶提交工作時將其複製到主表格中。
+0

感謝您的快速建議。我會考慮你的兩個選擇。我正在做一個iOS應用程序到Android的克隆,所以設計流程的改變對我來說不是一種選擇。 – rawcoder064 2013-03-26 15:40:22

+0

但是,我很好奇,想知道如果我使用auto commit關閉並在提交之前進行回滾(保持連接打開),可能是什麼問題? – rawcoder064 2013-03-26 15:46:45

+0

什麼也沒有。只要記住有一個連接打開到數據庫。任何其他數據庫操作都將受到像@ rawcoder064這樣的事務中的連接的影響。 – Gray 2013-03-26 15:49:08

2

嗯不知道會自動爲你做這個的任何方法。如果你真的想自動做,你也可以檢查交易。他們有內置的控制回滾失敗。不完全是你想要的,但也許可以調整。

您也可以更手動地執行此操作,並將內存中的1(最後一個)對象保存爲要刪除的對象。如果一個人想要「撤銷」更改,則可以使用ORMLite重新添加該對象。可能比其他選項容易得多。

+0

我可以看到DAO.rollBack(DatabaseConnection連接)方法。但不知道它是否有用。 – rawcoder064 2013-03-26 10:53:56

+0

關於你的第二個建議.....從你的數據結構中可以看到,一次訪問中可以有很多圖片,並且在一個站點中訪問的次數多得多......因此,將這麼多數據存儲在內存中是沒有用的。 。是嗎? – rawcoder064 2013-03-26 11:04:39

+0

在內存中可能不正確,但重點在於該庫稱爲'ormLITE'。它爲您提供了ORM的基本需求,而不會對移動設備造成沉重負擔。您必須手動處理回滾數據庫。有許多選項可以做到這一點,例如不斷構建自定義回滾查詢,將對象保存在內存中或調整數據庫結構,因爲@Gray使用臨時表或字段建議。要點是,你必須以適合你的邏輯的最佳方式自己做。 Ps是Grey的圖書館,所以請採取他的建議;) – 2013-03-26 12:47:54