android - Android 类 Rails 数据库架构版本升级

标签 android database schema

所以,我正在使用 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/

相关文章:

java - 如何在不重复的情况下通过 A 类将 Java 中的对象从 B 类传递到 C 类

Android Studio : ButterKnife 6. 1.0 重复类:$$View Injector

php - CodeIgniter 从传递单行到传递多行

mysql - 将 CSV 导入 MySQL 和

php - 为什么某些 MySQL 字段现在需要默认值?

android - 资源条目 ic_launcher 已定义

android - TextView 上的 addFontWeightStyle NoSuchMethodException

php - 如何设计引用多个表的灵活 MySQL 通知架构?

XmlSchema 空白崩溃 : What happens to multiple whitespaces?

json - Pyspark:从涉及数组列的 Json 架构创建架构