【问题标题】:Need to roll the database back to previous state需要将数据库回滚到以前的状态
【发布时间】:2013-03-26 10:42:33
【问题描述】:

这是我使用 ORMLITE 保存在 sqlite db 中的模型类。

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

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

public class Pic{
                 ...
                 ...

                 }

现在我在一个视图中添加、编辑或删除这三个表。我认为有一个按钮可以取消更改(添加、编辑、删除)。所以我需要回滚到数据库的先前状态。

如何使用 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;
}
    .....
     .....

【问题讨论】:

    标签: android rollback ormlite autocommit


    【解决方案1】:

    嗯,不知道有什么方法可以自动为您执行此操作。如果你真的想自动完成,你也可以查看 Transactions。它们具有内置控件,可在失败时回滚。不完全是你想要的,但也许可以调整。

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

    【讨论】:

    • 我可以看到 DAO.rollBack(DatabaseConnection connection) 方法。但想知道它是否有用。
    • 关于您的第二个建议.....从我的数据结构中可以看出,一次访问可以有很多图片,并且可以在一个站点中访问更多......所以将这么多数据存储在记忆没有帮助....是吗?
    • 在内存中可能不正确,但关键是该库被称为“ormLITE”。它为您提供了 ORM 的基本需求,而无需为移动设备增加负担。您必须手动处理回滚数据库。有许多选项可以做到这一点,例如不断构建自定义回滚查询、将对象保存在内存中或按照@Gray 建议的临时表或字段调整数据库结构。关键是,您必须以适合您逻辑的最佳方式自己做。 PS 这是格雷的图书馆,所以请记住他的建议;)
    【解决方案2】:

    是的,我非常同意@Stefan。我认为您需要在您的应用程序内部执行此操作,而不是依赖数据库构造来返回之前的状态。

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

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

    【讨论】:

    • 感谢您的快速建议。我会考虑你的两个选择。我正在将 IOS 应用程序克隆到 android,因此更改设计流程不是我的选择。
    • 但是我很想知道我是否在关闭自动提交的情况下执行此操作并在提交之前进行回滚(保持连接打开)可能是什么问题?
    • 也许没什么。请记住,只有一个连接打开到数据库。在@rawcoder064 之类的事务中保持连接会影响任何其他数据库操作。
    • 如果我确保在此期间不会执行我的应用程序的任何其他数据库操作,那有什么问题吗?
    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多