Saya sudah membuat tabel sqlite untuk aplikasi saya, tetapi sekarang saya ingin menambahkan tabel baru ke database.
Saya mengubah versi DB seperti di bawah ini
private static final int DATABASE_VERSION = 2;
dan Menambahkan string untuk membuat tabel
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
dan onUpgrade
seperti di bawah ini:
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE_incident);
database.execSQL(DATABASE_CREATE_audio);
database.execSQL(DATABASE_CREATE_video);
database.execSQL(DATABASE_CREATE_image);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop table and add new tables when version 2 released.
db.execSQL(DATABASE_CREATE_color);
}
Tetapi untuk beberapa alasan tabel baru tidak dibuat. Apa yang saya lakukan salah?
Jawaban:
1. Tentang onCreate () dan onUpgrade ()
onCreate(..)
dipanggil setiap kali aplikasi baru saja dipasang.onUpgrade
dipanggil setiap kali aplikasi ditingkatkan dan diluncurkan dan versi database tidak sama.2. Meningkatkan versi db
Anda membutuhkan konstruktor seperti:
PENTING: Hanya menaikkan versi aplikasi saja tidak cukup untuk
onUpgrade
dipanggil!3. Jangan lupakan pengguna baru Anda!
Jangan lupa tambahkan
ke metode onCreate () Anda juga atau aplikasi yang baru diinstal tidak akan memiliki tabel.
4. Bagaimana menangani beberapa perubahan database dari waktu ke waktu
Saat Anda memiliki peningkatan aplikasi berturut-turut, beberapa di antaranya memiliki peningkatan basis data, Anda ingin memastikan untuk memeriksa
oldVersion
:Dengan cara ini ketika pengguna meningkatkan dari versi 1 ke versi 3, mereka mendapatkan kedua pembaruan. Ketika seorang pengguna meningkatkan dari versi 2 ke 3, mereka hanya mendapatkan pembaruan revisi 3 ... Lagi pula, Anda tidak dapat mengandalkan 100% basis pengguna Anda untuk meningkatkan setiap kali Anda merilis pembaruan. Terkadang mereka melewatkan pembaruan atau 12 :)
5. Menjaga nomor revisi Anda terkendali saat mengembangkan
Dan akhirnya ... menelepon
benar-benar mencopot pemasangan aplikasi. Ketika Anda menginstal lagi, Anda dijamin akan mencapai
onCreate
yang membuat Anda tidak perlu terus menaikkan versi database ke stratosfer saat Anda mengembangkan ...sumber
oldVersion
argumen yang disampaikan? Jika ada pernyataan pemutakhiran yang dapat diulang, Anda mungkin akhirnya mengulanginya pada database yang sebagian besar terbaru. Jika salah satu pernyataan memotong tabel, itu akan sangat buruk.newVersion
agak tidak berguna, karena Anda selalu menetapkan versi database saat ini dalam konstruktor (lihat bagian 2) dan versi ini akan selalu cocok. Ide utamanya di sini adalah Anda tidak ingin hanya meningkatkan dari mana pun pengguna langsungnewVersion
tanpa melewati setiap peningkatan tambahan lainnya di antaranya.CREATE_READINGS
Logika tidak boleh ada di onUpgrade, karena ini adalahonCreate
metode versi pertama Anda. Pikirkan kasus dionUpgrade
sakelar sebagai "Saya meningkatkan DARIoldVersion
". Anda tidak akan membuat tabel bacaan jika Anda meningkatkan dari versi 1, karena seharusnya sudah ada. Mudah-mudahan ini masuk akal ...Kode Anda sudah benar. Saran saya adalah database sudah mengira itu ditingkatkan. Jika Anda menjalankan proyek setelah menambah nomor versi, tetapi sebelum menambahkan
execSQL
panggilan, database di perangkat pengujian / emulator Anda mungkin sudah percaya bahwa itu ada di versi 2.Cara cepat untuk memverifikasi ini adalah dengan mengubah nomor versi menjadi 3 - jika ditingkatkan setelah itu, Anda tahu itu hanya karena perangkat Anda yakin itu sudah ditingkatkan.
sumber
onCreate()
seperti yang ditunjukkan jkschneider.Anda dapat menggunakan
onUpgrade
metode SQLiteOpenHelper . Dalam metode onUpgrade, Anda mendapatkan oldVersion sebagai salah satu parameter.Dalam
onUpgrade
penggunaan aswitch
dan di masing-masingcase
gunakan nomor versi untuk melacak versi database saat ini.Yang terbaik adalah Anda mengulang dari
oldVersion
kenewVersion
, menambahversion
1 pada satu waktu lalu memutakhirkan database selangkah demi selangkah. Ini sangat membantu ketika seseorang dengan database versi 1 mengupgrade aplikasi setelah waktu yang lama, ke versi yang menggunakan database versi 7 dan aplikasi mulai mogok karena perubahan tertentu yang tidak kompatibel.Kemudian pembaruan dalam basis data akan dilakukan secara bertahap, mencakup semua kasus yang mungkin, yaitu memasukkan perubahan dalam basis data yang dilakukan untuk setiap versi baru dan dengan demikian mencegah aplikasi Anda mogok.
Sebagai contoh:
sumber
Jawaban @ jkschneider benar. Namun ada pendekatan yang lebih baik.
Tulis perubahan yang diperlukan dalam file sql untuk setiap pembaruan seperti yang dijelaskan di tautan https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
File .sql ini akan dijalankan dalam metode onUpgrade () sesuai dengan versi database.
DatabaseHelper.java
Contoh proyek juga disediakan di tautan yang sama: https://github.com/riggaroo/AndroidDatabaseUpgrades
sumber
Menangani versi database adalah bagian yang sangat penting dalam pengembangan aplikasi. Saya berasumsi bahwa Anda sudah memiliki kelas AppDbHelper yang diperluas
SQLiteOpenHelper
. Saat Anda memperpanjangnya, Anda perlu mengimplementasikanonCreate
danonUpgrade
metode.Kapan
onCreate
danonUpgrade
metode dipanggilonCreate
dipanggil saat aplikasi baru dipasang.onUpgrade
dipanggil saat aplikasi diperbarui.Mengorganisir versi Database Saya mengelola versi dalam metode kelas. Buat implementasi Migrasi antarmuka. Misalnya untuk versi pertama buat
MigrationV1
kelas, buat versi keduaMigrationV1ToV2
(ini adalah konvensi penamaan saya)Contoh migrasi:
onCreate
: SejakonCreate
akan dipanggil ketika aplikasi baru saja diinstal, kami juga perlu menjalankan semua migrasi (pembaruan versi database). JadionCreate
akan terlihat seperti ini:onUpgrade
: Metode ini akan dipanggil ketika aplikasi sudah diinstal dan diperbarui ke versi aplikasi baru. Jika aplikasi berisi perubahan database apa pun, letakkan semua perubahan database di kelas Migrasi baru dan versi database tambahan.Misalnya, pengguna telah menginstal aplikasi yang memiliki database versi 1, dan sekarang versi database diperbarui ke 2 (semua pembaruan skema disimpan
MigrationV1ToV2
). Sekarang ketika aplikasi diupgrade, kita perlu mengupgrade database dengan menerapkan perubahan skema databaseMigrationV1ToV2
seperti ini:sumber