Обновление версии схемы базы данных в стиле Rails для Android - PullRequest
4 голосов
/ 13 февраля 2011

Итак, я работаю с базой данных Android SQLite с SQLiteOpenHelper. Кажется, у него есть концепция версий и обновлений базы данных ... но похоже, что вы должны использовать свой собственный код, чтобы фактически выполнить обновления, и поддерживать свой метод onCreate в курсе ваших обновлений.

Исходя из опыта разработки Rails, это выглядит немного примитивно. Для непосвященных Rails позволяет вам просто написать обновление класса для версии, а Rails позаботится о применении тех версий, которые должны быть ... это относится и к созданию БД; у вас есть только одно представление вашей схемы базы данных, набор миграций. Rails также делает DB-независимое представление изменений схемы, но это не обязательно для Android, потому что он поддерживает только SQLite (что нормально).

Кто-нибудь написал достойный класс помощника по миграции схем для Android, который позволяет мне приблизиться к нирване управления схемами БД (RailsEdition (TM))? Это спасет меня от утомительной реализации.

1 Ответ

3 голосов
/ 28 июня 2011

Учитывая, что я не нашел ничего, что поддерживало бы 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;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...