所以,我正在使用带有SQLiteOpenHelper
的Android SQLite数据库。它似乎有一个数据库版本和升级的概念......但看起来您应该推出自己的代码来实际进行升级,并使您的onCreate
方法与您的更新保持同步
来自Rails开发背景,这似乎有点原始。对于初学者来说,Rails允许你只编写一个每个版本升级的类,而Rails负责应用任何需要的版本......这也适用于数据库创建;您只有一个表示数据库架构,即一组迁移。 Rails还对模式更改进行了独立于数据库的表示,但这对Android来说不是必需的,因为它只支持SQLite(很好)。
是否有人为Android编写了一个体面的模式迁移助手类,这使我能够更接近数据库模式管理天堂(RailsEdition(TM))?这将拯救我滚动我自己丑陋的实现。
答案 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;
}
}
}
}