Обновление версий базы данных sqlite? - PullRequest
7 голосов
/ 25 декабря 2011

У меня есть база данных, в которую я хочу добавить столбец, я изменил статическую версию базы данных, но когда я запускаю программу на моем устройстве, нового столбца все еще нет, поэтому я предполагаю, что мой onUpdate не вызывается и я не уверен почему.

так я создаю базу данных

     private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            createTables(db);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                              int newVersion) 
        {
            Log.w("CalendarDB", "Upgrading database from version " + oldVersion 
                  + " to "
                  + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS Events_Table");
            onCreate(db);
        }

        private void createTables(SQLiteDatabase db){
            db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " +
                    EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, " + DATE + " TEXT, " + START + " LONG, " + END + " TEXT, " + REAL_START_TIME + " TEXT," 
                    + REAL_END_TIME + " TEXT," + COLOR + " TEXT, " + BLINK + " TEXT, " + VIBRATE + " TEXT, " + RING_TONE_PATH + " TEXT, " + ICON + " TEXT, " + REMINDERS +
                    " TEXT, " + START_WITH_REMINDER + " TEXT, " + CALENDAR_ID + " TEXT, " + EVENT_ID + " TEXT);");
        }
    }

Есть ли еще что-то, что я должен сделать, чтобы позвонить на onUpdate? Я попытался выполнить этот ответ , но все равно ничего не получилось

Ответы [ 2 ]

11 голосов
/ 25 декабря 2011

Чтобы обновить базу данных в Android, вы должны увеличить DATABASE_VERSION на единицу, чтобы SQLOpenHelper знал, что он должен вызывать метод onUpgrade.

Rembember

Это работает только тогда, когда вы вызываете getWritableDatabase (), иначе не будет обновляться. И если вы измените версию и вызовете getReadableDatabase, она покажет исключение

throw new SQLiteException("Can't upgrade read-only database from version " +
                        db.getVersion() + " to " + mNewVersion + ": " + path);

Но почему? Когда вы вызываете getWritableDatabase , вы видите код проверки, если версия одинакова:

if (version != mNewVersion) {
                db.beginTransaction();
                try {
                    if (version == 0) {
                        onCreate(db);
                    } else {
                        if (version > mNewVersion) {
                            onDowngrade(db, version, mNewVersion);
                        } else {
                            onUpgrade(db, version, mNewVersion);
                        }
                    }
                    db.setVersion(mNewVersion);
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
}
}

Обновление

Хорошо получается, что он должен работать с getReadableDatabase (), так как в коде вы всегда получаете WrittableDatabase. Так что он должен работать с обоими методами, вот документация для getReadableDatabase ():

Создать и / или открыть базу данных. Это будет тот же объект, возвращенный by getWritableDatabase (), если не возникает каких-либо проблем, таких как полный диск, требует, чтобы база данных была открыта только для чтения. В этом случае Объект базы данных только для чтения будет возвращен. Если проблема устранена, будущий вызов getWritableDatabase () может завершиться успешно, и в этом случае объект базы данных только для чтения будет закрыт, а объект чтения / записи будет возвращен в будущем.

1 голос
/ 25 декабря 2011

Я предлагаю вам увеличить DATABASE_VERSION на единицу, что приведет к вызову приложением onUpgrade ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...