适用于Android的类似Rails的数据库架构版本升级

时间:2011-02-12 23:51:04

标签: android database schema

所以,我正在使用带有SQLiteOpenHelper的Android SQLite数据库。它似乎有一个数据库版本和升级的概念......但看起来您应该推出自己的代码来实际进行升级,并使您的onCreate方法与您的更新保持同步

来自Rails开发背景,这似乎有点原始。对于初学者来说,Rails允许你只编写一个每个版本升级的类,而Rails负责应用任何需要的版本......这也适用于数据库创建;您只有一个表示数据库架构,即一组迁移。 Rails还对模式更改进行了独立于数据库的表示,但这对Android来说不是必需的,因为它只支持SQLite(很好)。

是否有人为Android编写了一个体面的模式迁移助手类,这使我能够更接近数据库模式管理天堂(RailsEdition(TM))?这将拯救我滚动我自己丑陋的实现。

1 个答案:

答案 0 :(得分:3)

鉴于我没有找到任何支持Android的东西,实际上有效,不需要我订阅疯狂的数据库世界观,并且没有花费太多(业余爱好项目,没有骰子),我走了过来与以下bodgy hack。它并不聪明,但至少可以让我以我熟悉的方式思考我的模式。我不认为它对于大型代码库/数据库架构来说真的很好用,但是如果你有这样的话,你可以负担得起的费用。

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