Android类似Rails的数据库模式版本升级

Android类似Rails的数据库模式版本升级,android,database,schema,Android,Database,Schema,因此,我正在使用Android SQLite数据库,使用SQLiteOpenHelper。它似乎有一个数据库版本和升级的概念。。。但是看起来您应该使用自己的代码来实际执行升级,并使您的onCreate方法在更新时保持最新 来自Rails开发背景,这看起来有点原始。对于新手来说,Rails只允许您在每次版本升级时编写一个类,Rails负责应用任何需要升级的版本。。。这也适用于数据库的创建;您的数据库模式只有一个表示形式,即迁移集。Rails还对模式更改进行了独立于DB的表示,但Android不需要

因此,我正在使用Android SQLite数据库,使用
SQLiteOpenHelper
。它似乎有一个数据库版本和升级的概念。。。但是看起来您应该使用自己的代码来实际执行升级,并使您的
onCreate
方法在更新时保持最新

来自Rails开发背景,这看起来有点原始。对于新手来说,Rails只允许您在每次版本升级时编写一个类,Rails负责应用任何需要升级的版本。。。这也适用于数据库的创建;您的数据库模式只有一个表示形式,即迁移集。Rails还对模式更改进行了独立于DB的表示,但Android不需要这样做,因为它只支持SQLite(这很好)


有没有人为Android编写了一个像样的模式迁移助手类,让我更接近DB模式管理nirvana(RailsEdition(TM))?这会让我省去自己难看的实现。

考虑到我没有发现任何支持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;
            }
        }
    }
}
public类AppDatabase扩展了SQLiteOpenHelper{
公共静态最终字符串数据库\u NAME=“main”;
公共静态最终int最新版本=4;
公共静态SQLITE数据库打开(上下文ctx){
AppDatabase db=新的AppDatabase(ctx);
返回db.getWritableDatabase();
}
公共AppDatabase(上下文ctx){
超级(ctx,数据库名称,空,最新版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
onUpgrade(db,0,最新版本);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){

对于(int i=oldVersion+1;嘿,Womble,这是一个很好的问题。我对android提供的数据库api非常不满意。来自rails的背景,我想实现rails类似的模型。你实现了什么吗?提前实现Thx。@Denis:我已经给出了我的最终解决方案作为答案。希望它能有所帮助。我知道这是一个老问题但仅供参考,我的插件Mechanoid可以很好地进行迁移!您在使用ALTER TABLE命令时遇到过任何问题吗?我认为某些版本的SQLite没有。我曾经使用过的Android版本上的每个SQLite版本(一直追溯到1.6版)似乎支持ALTER TABLE。它只是删除不受支持的列