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