所以,我正在使用 Android SQLite 数据库,使用 SQLiteOpenHelper
。它似乎有数据库版本和升级的概念......但看起来你应该滚动自己的代码来实际进行升级,并保持你的 onCreate
方法是最新的与您的更新。
来自 Rails 开发背景,这似乎有点原始。对于外行,Rails 允许您只编写一个类-每个版本-升级,Rails 负责应用需要的任何版本……这也适用于数据库创建;您只有一个 表示您的数据库模式,即一组迁移。 Rails 还对模式更改进行独立于数据库的表示,但这对 Android 来说不是必需的,因为它只支持 SQLite(这很好)。
有没有人为 Android 编写了一个像样的模式迁移帮助程序类,让我更接近 DB 模式管理必杀技 (RailsEdition(TM))?这将使我免于滚动我自己的丑陋实现。
最佳答案
鉴于我没有找到任何支持 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;
}
}
}
}
关于android - Android 类 Rails 数据库架构版本升级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981441/