安卓版的类似Rails的数据库架构版本升级

4
因此,我正在使用 Android SQLite 数据库,并使用 SQLiteOpenHelper。它似乎有一个数据库版本和升级的概念...但是看起来你应该自己编写代码来实际执行升级,并保持你的 onCreate 方法与更新保持同步。
对于 Rails 开发背景不熟悉的人来说,这似乎有点原始。对于未经培训的人来说,Rails 允许您只编写每个版本升级的类,而 Rails 负责应用需要的任何版本...这也适用于 DB 创建;您只有一个数据库模式表示,即迁移集。Rails 还为模式更改提供了独立于数据库的表示,但对于 Android 来说并不必要,因为它仅支持 SQLite(这很好)。
是否有人为 Android 编写了一个体面的模式迁移助手类,使我能够更接近数据库模式管理极乐世界(RailsEdition(TM))?这将节省我编写自己丑陋实现的时间。

嘿Womble,非常好的问题。我立即对Android提供的数据库API感到不满意。作为来自Rails背景的人,我想要实现类似于Rails的模型。你已经实现了什么吗?提前感谢。 - Denis
@Denis:我已将最终的解决方案作为答案发布。希望能对您有所帮助。 - womble
我知道这已经过时了,但仅供参考,我的插件Mechanoid可以进行迁移。http://robotoworks.github.com/mechanoid/ - Ian Warwick
1个回答

3

考虑到我没有找到任何支持Android的、实际可用且不需要订阅疯狂数据库世界观并且价格不高(业余项目,无法承担)的东西,所以我想出了以下折衷的方法。这并不聪明,但至少让我能够用我熟悉的方式思考我的模式。我不指望它能很好地适用于大型代码库/数据库模式,但如果你有这样的需求,你可能负担得起支付费用。

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

不错!你在使用 ALTER TABLE 命令时遇到过任何问题吗?我认为某些版本的 SQLite 没有这个命令。 - you786
我使用过的所有 Android 版本中的 SQLite 都支持 ALTER TABLE,甚至包括 1.6 版本。 - womble
仅删除列是不受支持的。 - Ian Warwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接