所以,我使用的是安卓的SQLite数据库和SQLiteOpenHelper。它似乎有数据库版本和升级的概念..。但是看起来你应该滚动你自己的代码来进行实际的升级,并让你的onCreate方法与你的更新保持同步。
从Rails开发背景来看,这似乎有点原始。对于不熟悉的人,Rails允许您只编写一个按版本升级的类,Rails负责应用任何需要的版本.这也适用于DB创建;您只有数据库模式的一种表示,即迁移集。Rails还对模式更改进行了独立于DB的表示,但这对于Android来说并不必要,因为它只支持SQLite (这很好)。
有没有人为Android编写了一个体面的模式迁移助手类,允许我更接近DB模式管理涅槃(RailsEdition(TM))?这样我就省去了自己丑陋的实现。
发布于 2011-06-28 03:48:15
考虑到我没有发现任何支持Android的东西,实际上是有效的,不需要我订阅一个疯狂的数据库世界视图,而且也不需要花很多钱(爱好项目,没有骰子),我想出了下面的bodgy。这并不聪明,但它至少允许我以我熟悉的方式思考我的模式。对于一个大型的代码库/数据库模式,我不认为它会很好地工作,但是如果您已经做到了,那么您可能有能力支付一些东西。
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;
}
}
}
}https://stackoverflow.com/questions/4981441
复制相似问题