【问题标题】:Rails-like database schema version upgrades for Android适用于 Android 的类 Rails 数据库架构版本升级
【发布时间】:2011-06-28 11:48:15
【问题描述】:

所以,我正在使用SQLiteOpenHelper 使用 Android SQLite 数据库。它似乎有一个数据库版本和升级的概念......但看起来你应该滚动你自己的代码来实际进行升级,并让你的 onCreate 方法与你的更新保持同步。

来自 Rails 开发背景,这似乎有点原始。对于没有经验的人,Rails 允许您只编写一个每个版本升级的类,Rails 负责应用需要的任何版本……这也适用于数据库创建;您只有 一个 表示您的数据库模式,即迁移集。 Rails 还对架构更改进行了独立于 DB 的表示,但这对于 Android 来说不是必需的,因为它只支持 SQLite(这很好)。

有没有人为 Android 编写了一个不错的架构迁移帮助程序类,让我更接近 DB 架构管理必杀技(RailsEdition(TM))?它可以避免我滚动自己的丑陋实现。

【问题讨论】:

  • 嘿 Womble,非常好的问题。我对 android 提供的数据库 api 非常不满意。来自 rails 背景,我想实现 rails 类似的模型。你已经实施了什么吗?提前谢谢。
  • @Denis:我已经将我的最终解决方案作为答案。希望对您有所帮助。
  • 我知道这是旧的,但仅供参考,我的插件 Mechanoid 可以进行迁移 robotoworks.github.com/mechanoid

标签: android database schema


【解决方案1】:

鉴于我没有找到任何支持 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;
            }
        }
    }
}

【讨论】:

  • 不错!您在使用 ALTER TABLE 命令时遇到过任何问题吗?我认为某些版本的 SQLite 没有。
  • 我曾经使用过的 Android 版本上的每个 SQLite 版本(一直到 1.6)似乎都支持 ALTER TABLE。
  • 只是删除不支持的列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多