Versi database nol pada instalasi awal

Saya telah merilis aplikasi (Waktu Dunia) dengan database awal. Sekarang saya ingin memperbarui aplikasi dengan peningkatan basis data.

Saya telah memasukkan kode pemutakhiran di OnUpgrade() dan memeriksa Versi baru. Tapi itu tidak dipanggil dalam pengujian lokal saya...

Jadi saya memasukkan pernyataan debug untuk mendapatkan versi database dan hasilnya nol.

Adakah yang tahu mengapa itu tidak diversi?

Berikut ini adalah kode untuk menyalin database dari folder Aset saya ...

    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();

Berikut ini adalah konstruktor saya, 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);
    }

}

--
Mahesh
http://android.maheshdixit.com


person mahesh    schedule 06.06.2010    source sumber
comment
Saat melakukan pembacaan, periksa -1 bukan 0.   -  person Romain Hippeau    schedule 06.06.2010
comment
Anda perlu menunjukkan implementasi SQLiteOpenHelper Anda pada onCreate() dan onUpgrade() jika Anda berharap mendapatkan bantuan dengan implementasi SQLiteOpenHelper Anda pada onCreate() dan onUpgrade()   -  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 = beberapa pernyataan sql...; db.execSQL(sql); } } public DatabaseHelper(Konteks konteks) { super(konteks, DB_NAME, null, DB_VERSION); this.myContext = konteks; }   -  person mahesh    schedule 06.06.2010


Jawaban (3)


Anda TIDAK perlu memeriksa Versi DB secara manual, SQLite melakukan ini untuk Anda jika dilakukan dengan benar.

Di kelas warisan SQLiteOpenHelper Anda, di konstruktor, Anda harus meneruskan DB_VERSION, seperti ini:

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);
                ...
        }
  ...
}

Kemudian di onCreate() Anda, jalankan tabel buat dan onUpgrade() lakukan apa pun yang perlu Anda lakukan untuk memutakhirkan tanpa memeriksa versinya, metode ini hanya akan dipanggil ketika SQLite sudah memeriksanya untuk Anda. Jika Anda perlu menjalankan kode di onUpgrade() cukup tingkatkan variabel DB_VERSION Anda.

person Ricardo Villamil    schedule 07.06.2010

Anda harus memiliki kelas yang merupakan adaptor basis data Anda. Ini akan memiliki baris yang mirip dengan berikut:

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

Yang perlu Anda lakukan agar aplikasi mengenali bahwa database perlu diperbarui adalah mengubah nomor yang disetel DATABASE_VERSION.

person David    schedule 06.06.2010
comment
Terima kasih atas balasan Anda... tapi saya sudah memiliki private static final berikut String DB_NAME = WorldClock; int akhir statis pribadi DB_VERSION = 2; public DatabaseHelper(Konteks konteks) { super(konteks, DB_NAME, null, DB_VERSION); this.myContext = konteks; } Saya juga mencoba menyetel versi secara eksplisit ke 1, tetapi saat ditingkatkan versi berikutnya, versi tersebut tidak memanggil OnUpgrade() - person mahesh; 06.06.2010

Saya menemukan masalahnya... Tampaknya OnCreate() dan OnUpgrade dipanggil hanya ketika Anda memanggil getReadableDatabases atau getWriteableDatabases(). Dan saya tidak memanggil keduanya jika DB ada. Saya malah memanggil SQLLiteDatabase.openDatabase(), yang tidak memanggil OnCreate atau OnUpgrade().

Sekarang saya memanggil secara eksplisit getWriteableDatabases(), ia memanggil OnUpgrade().

Terima kasih atas semua tanggapan Anda...

person mahesh    schedule 20.06.2010