Android 需要将数据库回滚到以前的状态

Android 需要将数据库回滚到以前的状态,android,rollback,ormlite,autocommit,Android,Rollback,Ormlite,Autocommit,下面是我的模型类,它们使用ORMLITE持久化在sqlite db中 public class Site{ ... ... Collection<Visit> visits; } public class Visit{ ... ... Collec

下面是我的模型类,它们使用ORMLITE持久化在sqlite db中

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;
}
    .....
     .....
公共类DatabaseHelper扩展了OrmLiteSqliteOpenHelper{
//数据库文件的名称
私有静态最终字符串数据库\u NAME=“Test.db”;
私有静态最终int数据库_VERSION=1;
私有Dao siteListDao=null;
私有Dao visitDao=null;
私有Dao picDao=null;
公共数据库助手(上下文){
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase数据库,ConnectionSource ConnectionSource){
试一试{
TableUtils.createTable(connectionSource,Site.class);
createTable(connectionSource,Visit.class);
createTable(connectionSource,Pic.class);
}捕获(SQLE异常){
Log.e(DatabaseHelper.class.getName(),“无法创建数据库”,e);
抛出新的运行时异常(e);
}catch(java.sql.sqle){
e、 printStackTrace();
}
}
公共Dao getVisitDao(){
if(null==visitDao){
试一试{
visitDao=getDao(Visit.class);
}catch(java.sql.sqle){
e、 printStackTrace();
}
}
回访道;
}
.....
.....

嗯,我不知道有什么方法可以自动为您执行此操作。如果您真的想自动执行此操作,您也可以签出事务。它们具有内置控件,可以在失败时回滚。这不完全是您想要的,但可能是可调整的


您也可以更手动地执行此操作并保存1(最后一个)内存中的对象,即您要删除的对象。如果某人想要“撤消”更改,您可以使用ORMLite重新添加该对象。可能比其他选项容易得多。

是的,我基本上同意@Stefan。我认为您需要在应用程序内部执行此操作,而不是依赖数据库构造来返回到上一个版本美国的国家

关闭自动提交(使用Sqlite下的事务)或直接使用事务不是实现这一点的方法。事务旨在允许您对数据库进行多次更改,然后在一次数据库更改失败时将其全部回滚。它们不打算在等待用户输入的几秒钟内保持打开状态

  • 您可以在数据中有一个提交的布尔字段或类似字段,以便通过删除
    committed=false
    或类似字段中的所有对象来更轻松地“还原”数据库
  • 您可以有单独的表,以便将对象存储到会话表中,然后在用户提交其工作时复制到主表中

我可以看到DAO.rollBack(数据库连接)方法。但不知道它是否有用。关于你的第二个建议……正如你可以从我的数据结构中看到的,一次访问可以有很多图片,一个站点可以有很多次访问……因此将这么多的数据存储在内存中是没有帮助的……是吗?内存中可能不正确,但重点是库被称为“ormLITE”。它提供了ou具备ORM的基本需求,但不会对移动设备造成负担。您必须手动处理回滚数据库的操作。有许多选项可以执行此操作,例如不断构建自定义回滚查询、将对象保留在内存中或按照@Gray的建议使用临时表或字段调整数据库结构。Point是的,你必须尽你最大的努力来适应你的逻辑。PS是格雷的图书馆,所以请记住他的建议;谢谢你的快速建议。我会考虑你的两个选择。我正在做一个iOS应用程序的克隆到Android,所以设计流程改变不是我的选择。但我很想知道我是否用AU做它。关闭提交并在提交前执行回滚(保持连接打开)可能是什么问题?可能什么都没有。请记住,只有一个连接打开到数据库。在@rawcoder064这样的事务中保持连接会影响任何其他数据库操作。如果我确保在这段时间内不会执行我的应用程序的任何其他数据库操作,是否有问题那么莱姆呢?