Версия базы данных нулевая при начальной установке

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

Я добавил код обновления в 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


person mahesh    schedule 06.06.2010    source источник
comment
При выполнении проверки чтения на -1, а не на 0.   -  person Romain Hippeau    schedule 06.06.2010
comment
Вам необходимо показать реализацию onCreate() и onUpgrade() вашей SQLiteOpenHelper, если вы ожидаете получить помощь с реализацией onCreate() и onUpgrade() вашей SQLiteOpenHelper.   -  person CommonsWare    schedule 06.06.2010
comment
@Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion == 1 && newVersion == 2){ String sql = некоторый оператор sql...; db.execSQL(sql); } } public DatabaseHelper (контекст контекста) { super (контекст, DB_NAME, null, DB_VERSION); this.myContext = контекст; }   -  person mahesh    schedule 06.06.2010


Ответы (3)


Вам НЕ нужно вручную проверять версию БД, 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.

person Ricardo Villamil    schedule 07.06.2010

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

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

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

person David    schedule 06.06.2010
comment
Спасибо за ваш ответ... но у меня уже есть следующая частная статическая финальная строка DB_NAME = WorldClock; частный статический окончательный int DB_VERSION = 2; public DatabaseHelper (контекст контекста) { super (контекст, DB_NAME, null, DB_VERSION); this.myContext = контекст; } Я также пытался явно установить версию 1, но при следующем обновлении он не вызывает OnUpgrade(). - person mahesh; 06.06.2010

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

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

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

person mahesh    schedule 20.06.2010