Обновление базы данных Android не обновляет версию базы данных после успешного обновления

StackOverflow https://stackoverflow.com//questions/11687473

Вопрос

Я пытаюсь добавить три новые таблицы в существующую базу данных sqlite, и у меня возникают проблемы с тем, что версия базы данных не обновляется после успешного обновления.Ниже приведен DatabaseHelper, который работает:

private static class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());
        db.execSQL(ORIGINAL_DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);
        db.setVersion(newVersion);
        Log.w(TAG, "Version after onUpgrade is " + db.getVersion());
    }       
}

Ниже приведена моя функция open():

public VehicleExpDbAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
    mDb = mDbHelper.getWritableDatabase();
    return this;
}

Ниже приведена моя функция close():

public void close() {
    mDb.close();
    mDbHelper.close();
}

Итак, что происходит при первом запуске с более высоким значением DATABASE_VERSION, это первый журнал onUpgrade:Старая версия 1. Новая версия 2. db.getVersion равен 1.

Второй журнал:Версия после onUpgrade – 2.

Но затем, когда к базе данных снова осуществляется доступ после запуска onUpgrade, номер версии БД не обновляется, и он проходит через onUpgrade с первым журналом в чтении onUpgrade:Старая версия 1. Новая версия 2. db.getVersion равен 1.

Затем приложение аварийно завершилось, поскольку оно пытается создать уже существующую таблицу.

Я также пробовал не устанавливать версию базы данных вручную в onUpgrade.Это тоже не сработало.Я также попытался обновить номер версии, запустив...

db.execSQL("PRAGMA user_version = " + newVersion);

... в конце onUpgrade.

РЕДАКТИРОВАТЬ:

По предложению Асвина Кумара я изменил свой onUpgrade на резервное копирование существующей таблицы, удаление всех таблиц и их повторное создание.Это не решило проблему с моей версией.Ниже приведены мои onUpgrade и onCreate:

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(ORIGINAL_DATABASE_CREATE);

        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        mOldDbContents = backupTables(db);

        db.execSQL("DROP TABLE IF EXISTS " + ORIGINAL_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_3_DATABASE_CREATE);

        onCreate(db);
    }   

Ниже приведены операторы sqlite, которые я использую для создания таблиц:

private static final String ORIGINAL_DATABASE_CREATE = "create table " + VEHICLE_EXPENSE_TABLE_NAME + 
        " (" + KEY_ROW_ID + " integer primary key autoincrement, " + 
        KEY_UNIX_DATE + " integer, " + 
        KEY_DATE + " not null default current_date, " +
        KEY_TIME + " not null default current_time, " + 
        KEY_DESCRIPTION + " text, " + 
        KEY_START_MILE + " integer, " + 
        KEY_END_MILE + " integer, " + 
        KEY_MILES + " text, " + 
        KEY_AMOUNT + " text, " 
        + KEY_PARTY_ID + " integer)";

private static final String NEW_TABLE_1_DATABASE_CREATE = "CREATE TABLE " + PURCHASE_HISTORY_TABLE_NAME + 
        "(" + HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " +
        HISTORY_STATE_COL + " INTEGER, " + 
        HISTORY_PRODUCT_ID_COL + " TEXT, " + 
        HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + 
        HISTORY_PURCHASE_TIME_COL + " INTEGER)";

private static final String NEW_TABLE_2_DATABASE_CREATE = "CREATE TABLE " + PURCHASED_ITEMS_TABLE_NAME + 
        "(" + PURCHASED_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        PURCHASED_QUANTITY_COL + " INTEGER)";

private static final String NEW_TABLE_3_DATABASE_CREATE = "CREATE TABLE " + TRIAL_LIMIT_TABLE_NAME + 
        "(" + TRIAL_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        TRIAL_PRODUCT_NAME + " TEXT, " + 
        TRIAL_START_DATE + " INTEGER)";

Любая помощь будет очень признательна.

Спасибо, Кевин

Это было полезно?

Решение 2

Исправлена моя собственная проблема.Проблема заключалась в том, что я создал отдельный класс помощника ДБ, который доступа к тому же БД, которое было пытаться обновить.В этом отдельном классе помощника ДБ номер версии был установлен на 1. Это приложение было моей первой Java и Android-программой, и я ужасно устанавливаю классы БД.Я консолировал все класс БД к тому, который я сейчас обновляю, и теперь моя версия БД обновляет, как следует.Ниже приведены мои последние занятия, если кто-то заинтересован.

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(VEHICLE_EXPENSE_DATABASE_CREATE);

        db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
        db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
        db.execSQL(TRIAL_TIME_DATABASE_CREATE);
    }


@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        if (oldVersion < newVersion) {

            if (oldVersion == 1) {
                db = upgradeTo2(db);
            }
        }
    }

private SQLiteDatabase upgradeTo2(SQLiteDatabase db) {

        db.beginTransaction();
        try {
            db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
            db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
            db.execSQL(TRIAL_TIME_DATABASE_CREATE);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w(TAG, "onUpgrade failed");
        } finally {
            db.endTransaction();
        }

        return db;
    }
.

Другие советы

В onUpgrade(), Вы должны drop существующие таблицы (после переноса данных в некоторую временную структуру данных), затем создайте новые таблицы (используя старые данные из структуры данных).Если вы этого не сделаете, старые таблицы все равно будут существовать.

Если это не решит проблему, вставьте точные команды, которые вы используете в db.execSQL()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top