Версия базы данных равна нулю при первоначальной установке - PullRequest
0 голосов
/ 06 июня 2010

Я выпустил приложение (мировое время) с начальной базой данных. Теперь я хочу обновить приложение с обновлением базы данных.

Я вставил код обновления в OnUpgrade () и проверил наличие новой версии. Но это не вызывалось в моем локальном тестировании ...

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

Есть идеи, почему он не версионируется?

Ниже приведен код для копирования базы данных из папки «Мои активы» ...

    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

Ниже приведен мой конструктор, OnCreate () и OnUpgrade ()

public DatabaseHelper(Context context) {

    super(context, DB_NAME, null, DB_VERSION);
    this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(oldVersion == 1 && newVersion == 2){
        String sql = "update statement...."; // i have a correct update statement here
        db.execSQL(sql);
    }

}

-
Махеш
http://android.maheshdixit.com

Ответы [ 3 ]

1 голос
/ 07 июня 2010

Вам НЕ нужно вручную проверять версию БД, SQLite сделает это за вас, если все сделано правильно.

В вашем унаследованном классе SQLiteOpenHelper в конструкторе вы должны передать DB_VERSION, что-то вроде этого:

public class DBHelper extends SQLiteOpenHelper {
    public static final String DB_NAME = "your_db_name";
    public static final int DB_VERSION = 2;

    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
                ...
        }
  ...
}

Затем в вашем onCreate () выполните таблицу создания, а onUpgrade () сделает все, что вам нужно для обновления без проверки версии, этот метод будет вызываться только тогда, когда SQLite уже проверил это для вас. Если вам нужно запустить код в onUpgrade (), просто увеличьте переменную DB_VERSION.

0 голосов
/ 20 июня 2010

Я обнаружил проблему ... Кажется, что OnCreate () и OnUpgrade вызываются только при вызове getReadableDatabases или getWriteableDatabases (). И я не звонил ни одному из них, если БД существует. Вместо этого я вызывал SQLLiteDatabase.openDatabase (), который не вызывает OnCreate или OnUpgrade ().

Теперь, когда я вызываю явно getWriteableDatabases (), он вызывает OnUpgrade ().

Спасибо за все ваши ответы, хотя ...

0 голосов
/ 06 июня 2010

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

private static final String  DATABASE_NAME = "sr4.db";
private static final int    DATABASE_VERSION = 1;

Все, что вам нужно сделать, чтобы приложение распознало, что база данных нуждается в обновлении, - это изменить значение DATABASE_VERSION на *.

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