2013-03-26 3 views
1

ORMLITE를 사용하여 sqlite db에 유지되는 모델 클래스입니다.데이터베이스를 이전 상태로 롤백해야합니다.

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

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

public class Pic{ 
       ... 
       ... 

       } 

이제 한 가지보기에서이 세 가지 표를 추가, 수정 또는 삭제합니다. 내보기에는 변경 사항을 취소하는 버튼이 있습니다 (추가, 편집, 삭제). 그래서 전 db의 이전 상태로 롤백해야합니다.

android와 함께 ormlite를 사용하여 세 개의 테이블 중 특정 상태로 롤백 할 수 있습니까?

나는 DAO.SetAutoCommit()startThreadConnection() 방법에 대해 ormlite의 문서를 읽기로했다. 나는이 두 가지를 사용하여 내가 할 수 있다고 생각한다. 그러나 그것을 사용하는 방법을 알아낼 수 없습니다. 나에게 그걸하는 법을 제안 해주세요.

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 애플 리케이션의 복제를하고있어 그래서 디자인 흐름이 나를 위해 옵션이 아닙니다. – rawcoder064

+0

하지만 내가 자동으로 커밋을하고 커밋 (연결을 유지하는 것) 전에 롤백을 수행하는지 궁금합니다. 무엇이 문제 일 수 있습니까? – rawcoder064

+0

아무 것도 아닐 수도 있습니다. 데이터베이스에 대해 단일 연결이 열려 있음을 기억하십시오. 다른 모든 데이터베이스 작업은 @ rawcoder064와 같은 트랜잭션에서 연결을 유지함으로써 영향을받습니다. – Gray

2

흠이 자동으로이 작업을 수행 할 어떤 방법에 대해 알고하지 않습니다

여기 내 DBHelper 클래스입니다. 자동으로 처리하고 싶다면 트랜잭션을 체크 아웃 할 수도 있습니다. 롤백 할 수있는 빌드 인 컨트롤이 있습니다. 정확히 원하는 것은 아니지만 조정 가능할 수도 있습니다.

더 많은 작업을 수동으로 수행하고 삭제할 개체 인 메모리에 1 (마지막) 개체를 저장할 수도 있습니다. 어떤 사람이 변경 사항을 '실행 취소'하려는 경우 ORMLite로 해당 객체를 다시 추가 할 수 있습니다. 다른 옵션보다 훨씬 쉽습니다.

+0

나는 DAO.rollBack (DatabaseConnection 연결) 메소드를 볼 수있다. 그러나 그 유용 여부를 궁금해. – rawcoder064

+0

귀하의 두 번째 suckession ..... 내 데이터 구조에서 볼 수 있듯이 한 번의 방문에서 많은 사진을 볼 수 있고 한 사이트에서 더 많은 방문을 할 수 있습니다 .... 이렇게 많은 데이터를 메모리에 저장하는 것이 도움이되지 않습니다 ... 그것은 무엇입니까? – rawcoder064

+0

메모리가 정확하지 않을 수도 있지만 요점은 라이브러리가 'ormLITE'라고합니다. 그것은 모바일 장치에 무거워 지 않고 ORM에 대한 기본 요구 사항을 제공합니다. 데이터베이스 롤백을 수동으로 처리해야합니다. @Gray가 임시 테이블이나 필드를 권고하면서 사용자 정의 롤백 쿼리를 지속적으로 작성하거나 메모리에 객체를 유지하거나 데이터베이스 구조를 조정하는 등의 다양한 옵션이 있습니다. 요점은, 당신이 당신의 논리에 맞출 수있는 가장 좋은 방법으로 직접해야만한다는 것입니다. Ps 그레이의 도서관, 그래서 그의 충고를 받아들이십시오;) –