1

これは、ORMLITEを使用してsqlitedbに永続化される私のモデルクラスです。

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

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

public class Pic{
                 ...
                 ...

                 }

1つのビューで、これら3つのテーブルを追加、編集、または削除します。ビューには、変更(追加、編集、削除)をキャンセルするためのボタンがあります。したがって、dbの以前の状態にロールバックする必要があります。

androidでormliteを使用して、3つのテーブルの特定の状態にこのロールバックを実現するにはどうすればよいですか?

DAO.SetAutoCommit()メソッドとstartThreadConnection()メソッドに関するormliteドキュメントを読みました。この2つでできると思います。しかし、それらの使い方を理解することはできません。やり方を教えてください。

これが私の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;
}
    .....
     .....
4

2 に答える 2

2

うーん、これを自動的に行う方法についてはわかりません。本当に自動的に実行したい場合は、トランザクションをチェックアウトすることもできます。失敗時にロールバックするための組み込みのコントロールがあります。正確にはあなたが望むものではありませんが、おそらく調整可能です。

さらに手動で実行して、削除するオブジェクトである1つの(最後の)オブジェクトをメモリに保存することもできます。変更を「元に戻す」場合は、ORMLiteを使用してそのオブジェクトを再度追加できます。おそらく他のオプションよりもはるかに簡単です。

于 2013-03-26T10:48:00.133 に答える
1

ええ、私は@Stefanにほとんど同意します。これはアプリケーション内で行う必要があり、以前の状態に戻るためにデータベース構造に依存する必要はないと思います。

自動コミット(ORMLiteがSqliteでトランザクションを使用する)をオフにしたり、トランザクションを直接使用したりすることは、これを行う方法ではありません。トランザクションは、データベースに複数の変更を加え、1つのデータベースの変更が失敗した場合にそれらをすべてロールバックできるように設計されています。ユーザーの入力を待つために数秒間開いたままにすることは意図されていません。

  • データにコミットされたブールフィールドなどを含めると、そのようなものがあるすべてのオブジェクトを削除してデータベースを「元に戻す」のが簡単になりますcommitted = false
  • オブジェクトをセッションテーブルに格納し、ユーザーが作業をコミットしたときにメインテーブルにコピーされるように、個別のテーブルを作成することもできます。
于 2013-03-26T12:19:30.587 に答える