2011-02-12 79 views
4

因此,我正在使用Android SQLite數據庫,其中有SQLiteOpenHelper。它似乎有一個數據庫版本和升級的概念......但它看起來像你應該推出你自己的代碼來實際進行升級,並保持你的更新onCreate方法最新。針對Android的Rails式數據庫模式版本升級

從Rails開發背景來看,這似乎有點原始。對於初學者來說,Rails允許你編寫一個每版本升級的類,並且Rails負責應用需要的任何版本......這也適用於數據庫創建;您只有一個表示您的數據庫模式,這是一組遷移。 Rails也做了一個與數據庫無關的模式更改表示,但這對於Android來說不是必需的,因爲它只支持SQLite(這很好)。

是否有人爲Android編寫了一個體面的模式遷移助手類,使我能夠更接近數據庫模式管理nirvana(RailsEdition(TM))?這將節省我滾動我自己丑陋的實施。

+0

嘿Womble,非常好的問題。我一直不滿意android提供的數據庫API。來自rails的背景我想實現rails類似的模型。你有沒有實現一些東西? Thx提前。 – Denis 2011-03-23 12:11:14

+0

@Denis:我已經把最終的解決方案作爲答案。希望能幫助到你。 – womble 2011-06-28 05:04:32

回答

3

鑑於我沒有發現任何支持Android的東西,實際上工作,並不需要我訂閱瘋狂的數據庫世界視圖,並沒有花費很多(愛好項目,沒有骰子),我來了與以下bodgy黑客。這並不聰明,但它至少允許我以我熟悉的方式思考我的模式。我不認爲它對於大型代碼庫/數據庫模式來說工作得很好,但如果你知道,你可能負擔得起某些東西。

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; 
      } 
     } 
    } 
}