SQLITE - установка версии новой базы данных - PullRequest
7 голосов
/ 04 октября 2011

Я использовал этот пример для создания базы данных, которую я копирую при новой установке

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

Проблема, с которой я столкнулся сейчас, состоит в том, что я сделал некоторые обновления базы данных иЯ предположил, что я также делаю эти обновления для мастер-файла в сборке, чтобы пользователи всегда получали наибольшую версию обновлений при новой установке

У меня есть другой класс, который обрабатывает все операторы запросов вызовов db.

Я установил эту строку

private static final int DATABASE_VERSION = 5;

При новой установке теперь база данных копируется корректно, но когда класс запроса снова вызывает помощник базы данных, вызывается метод onupgrade () и пытается выполнить обновление допоследняя версия и приложение вылетает, когда оно пытается выполнить обновления, которые не могут быть выполнены

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

public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

только для полноты картины. Вот пример onupgrade ()

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

        dbUpgrade = new DatabaseUpgrades(context);

        Log.d(DEBUG_TAG, "Calling onupgrade db");
        Log.d(DEBUG_TAG + " : " + DatabaseHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                    + newVersion);

        if (oldVersion == 1) {
            Log.d(DEBUG_TAG, "Updating to Version 2");
            dbUpgrade.upgradeDB2(db);
            oldVersion++;
        }
}

. Вопрос о том, какая версия нового набора баз данныхна новую установку и как вы можете перезаписать его, если он не версии 5

Спасибо

Ответы [ 3 ]

5 голосов
/ 04 октября 2011

Это правильно:

public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
        /* ... */
}

Я поместил ниже getWritableDatabase() исходный код, и, как вы видите, он не будет вызывать onUpgrade(), если версия в файле db не равна текущей новой версии, которую вы передаете в конструкторе (строка version != mNewVersion). Таким образом, либо файл вашей базы данных не перезаписан, либо номер версии в вашей новой базе данных неверен. Пожалуйста, проверь это.

/**
 * Create and/or open a database that will be used for reading and writing.
 * Once opened successfully, the database is cached, so you can call this
 * method every time you need to write to the database.  Make sure to call
 * {@link #close} when you no longer need it.
 *
 * <p>Errors such as bad permissions or a full disk may cause this operation
 * to fail, but future attempts may succeed if the problem is fixed.</p>
 *
 * @throws SQLiteException if the database cannot be opened for writing
 * @return a read/write database object valid until {@link #close} is called
 */
public synchronized SQLiteDatabase getWritableDatabase() {
    if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {
        return mDatabase;  // The database is already open for business
    }

    if (mIsInitializing) {
        throw new IllegalStateException("getWritableDatabase called recursively");
    }

    // If we have a read-only database open, someone could be using it
    // (though they shouldn't), which would cause a lock to be held on
    // the file, and our attempts to open the database read-write would
    // fail waiting for the file lock.  To prevent that, we acquire the
    // lock on the read-only database, which shuts out other users.

    boolean success = false;
    SQLiteDatabase db = null;
    if (mDatabase != null) mDatabase.lock();
    try {
        mIsInitializing = true;
        if (mName == null) {
            db = SQLiteDatabase.create(null);
        } else {
            db = mContext.openOrCreateDatabase(mName, 0, mFactory);
        }

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

        onOpen(db);
        success = true;
        return db;
    } finally {
        mIsInitializing = false;
        if (success) {
            if (mDatabase != null) {
                try { mDatabase.close(); } catch (Exception e) { }
                mDatabase.unlock();
            }
            mDatabase = db;
        } else {
            if (mDatabase != null) mDatabase.unlock();
            if (db != null) db.close();
        }
    }
}

EDIT
Вы можете проверить версию в своем новом файле базы данных с помощью следующего запроса:

PRAGMA user_version;

В вашем случае он должен вернуть 5.

0 голосов
/ 27 ноября 2012

просто создайте

@Override
    public void onCreate(SQLiteDatabase db) {
        onUpgrade(db, 0, DATABASE_VERSION);
0 голосов
/ 04 октября 2011

Он получил метод под названием onUpgrade (база данных SQLiteDatabase, int oldVersion, int newVersion) { выполните ваши обновления здесь. , , }

если вы используете класс SQLiteOpenHelper, то только вы можете переопределить этот метод.

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