2011-02-12 2 views
4

그래서 나는 SQLiteOpenHelper과 함께 Android SQLite 데이터베이스로 작업하고 있습니다. 데이터베이스 버전 및 업그레이드에 대한 개념이있는 것 같지만 업그레이드를 실제로 수행하기 위해 코드를 직접 작성한 것으로 보이며 onCreate 메소드를 최신으로 유지하십시오.Android 용 레일즈 형 데이터베이스 스키마 버전 업그레이드

레일 개발 배경에서 볼 때, 약간 원시적 인 것처럼 보입니다. 초보자에게는 Rails가 버전 별 클래스 업그레이드 만 작성할 수 있으며, Rails는 버전이 필요한 버전을 적용합니다 ... 이는 DB 생성에도 적용됩니다. 당신은 하나만 데이터베이스 스키마, 마이 그 레이션 집합의 표현. Rails는 또한 스키마 변경에 대해 DB 독립적 인 표현을 수행하지만, 안타깝게도 SQLite 만 지원하기 때문에 Android에는 필요하지 않습니다.

DB 스키마 관리 열반 (RailsEdition (TM))에 더 가까워 질 수 있도록 적절한 스키마 마이그레이션 도우미 클래스를 Android 용으로 작성한 사람이 있습니까? 그것은 내 자신의 추악한 구현을 구해줄거야.

+0

안녕하세요, 아주 좋은 질문입니다. 나는 immidiatelly 안드로이드가 제공 한 데이터베이스 api에 만족하지 못했습니다. 레일즈 배경에서 레일즈 비슷한 모델을 구현하고 싶습니다. 아직 뭔가를 구현 했습니까? 사전에 Thx. – Denis

+0

@Denis : 답으로 궁극적 인 해결책을 제시했습니다. 희망이 도움이됩니다. – womble

+0

이 플러그인은 오래된 플러그인이지만 참고 용으로 만 사용 가능합니다. Mechanoid가 마이그레이션을 수행 할 수 있습니다. http://robotoworks.github.com/mechanoid/ –

답변

3

실제로 안드로이드를 지원하는 것을 찾지 못했고, 실제로 작동했기 때문에 미친 데이터베이스 세계관에 가입 할 필요가 없었으며 비용도 많이 들지 않았습니다 (취미 프로젝트, 주사위 없음). 다음과 같은 해킹과 함께. 그것은 영리하지는 않지만 적어도 필자가 익숙한 방식으로 내 스키마에 대해 생각하게합니다. 큰 코드베이스/데이터베이스 스키마의 경우 제대로 작동 할 것이라고 기대하지는 않지만, 그럴 경우 비용을 지불 할 수 있습니다.

public class AppDatabase extends SQLiteOpenHelper { 
    public static final String DATABASE_NAME = "main"; 
    public static final int LATEST_VERSION = 4; 

    public static SQLiteDatabase open(Context ctx) { 
     AppDatabase db = new AppDatabase(ctx); 
     return db.getWritableDatabase(); 
    } 

    public AppDatabase(Context ctx) { 
     super(ctx, DATABASE_NAME, null, LATEST_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     onUpgrade(db, 0, LATEST_VERSION); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     for (int i = oldVersion+1; i <= newVersion; i++) { 
      switch (i) { 
      case 1: 
       db.execSQL("CREATE TABLE blah (" + 
         "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + 
         "start CHAR(4)," + 
         "end CHAR(4)" + 
         ")"); 
       break; 
      case 2: 
       db.execSQL("CREATE TABLE fortnights (" + 
         "first_day DATE PRIMARY KEY" + 
         ")"); 
       break; 
      case 3: 
       db.execSQL("ALTER TABLE shifts ADD top CHAR(4)"); 
       db.execSQL("ALTER TABLE shifts ADD bottom CHAR(4)"); 
       db.execSQL("UPDATE shifts set top=start, bottom=end"); 
       break; 
      case 4: 
       db.execSQL("ALTER TABLE shifts ADD callout BOOLEAN DEFAULT 0"); 
       break; 
      } 
     } 
    } 
} 
+0

Nice! ALTER TABLE 명령을 사용하여 문제가 발생 했습니까? SQLite의 일부 버전에는없는 것으로 생각됩니다. – you786

+0

내가 사용한 적이있는 Android 릴리스에있는 SQLite의 모든 버전 (모두 1.6으로 돌아 감)은 ALTER TABLE을 지원하는 것으로 보입니다. – womble

+0

지원되지 않는 컬럼 만 삭제 중입니다. –

관련 문제