Saya telah membuat tabel saya di SQLiteOpenHelper
onCreate()
tetapi saya terima
SQLiteException: no such table
atau
SQLiteException: no such column
kesalahan. Mengapa?
CATATAN:
(Ini adalah ringkasan gabungan dari puluhan pertanyaan serupa setiap minggu. Berusaha untuk memberikan pertanyaan / jawaban wiki komunitas "kanonik" di sini sehingga semua pertanyaan itu dapat diarahkan ke referensi yang baik.)
Jawaban:
SQLiteOpenHelper
onCreate()
danonUpgrade()
panggilan balik dipanggil saat database sebenarnya dibuka, misalnya dengan panggilan kegetWritableDatabase()
. Database tidak dibuka ketika objek pembantu database itu sendiri dibuat.SQLiteOpenHelper
versi file database. Nomor versi adalahint
argumen yang diteruskan ke konstruktor . Dalam file database, nomor versi disimpan diPRAGMA user_version
.onCreate()
hanya berjalan ketika file database tidak ada dan baru saja dibuat. JikaonCreate()
kembali dengan sukses (tidak melempar pengecualian), database diasumsikan dibuat dengan nomor versi yang diminta. Sebagai implikasinya, Anda tidak harus menangkapSQLException
s dionCreate()
diri Anda.onUpgrade()
hanya dipanggil ketika file database ada tetapi nomor versi yang disimpan lebih rendah dari yang diminta dalam konstruktor. TheonUpgrade()
harus memperbarui tabel skema ke versi yang diminta.Saat mengubah skema tabel dalam kode (
onCreate()
), Anda harus memastikan database diperbarui. Dua pendekatan utama:Hapus file database lama agar
onCreate()
dijalankan kembali. Ini sering lebih disukai pada waktu pengembangan di mana Anda memiliki kontrol atas versi yang diinstal dan kehilangan data tidak menjadi masalah. Beberapa cara untuk menghapus file database:Copot pemasangan aplikasi. Gunakan manajer aplikasi atau
adb uninstall your.package.name
dari shell.Hapus data aplikasi. Gunakan manajer aplikasi.
Tambahkan versi database sehingga
onUpgrade()
dipanggil. Ini sedikit lebih rumit karena lebih banyak kode diperlukan.Untuk peningkatan skema waktu pengembangan di mana kehilangan data tidak menjadi masalah, Anda bisa menggunakannya
execSQL("DROP TABLE IF EXISTS <tablename>")
untuk menghapus tabel yang ada dan menelepononCreate()
untuk membuat ulang basis data.Untuk versi yang dirilis, Anda harus menerapkan migrasi data
onUpgrade()
agar pengguna Anda tidak kehilangan data mereka.sumber
onUpdate()
, periksa setiap versi lama dan lakukan migrasi data yang tepat. Dan kemudian ketika pengguna memperbarui aplikasi mereka (mereka memiliki file db lama),onUpgrade
akan Dipicu, dan jika pengguna baru menginstal,onCreate()
dipicu.Untuk lebih lanjut menambahkan poin yang hilang di sini, sesuai permintaan Jaskey
Versi database disimpan dalam
SQLite
file database.menangkap adalah konstruktor
Jadi ketika konstruktor pembantu database dipanggil dengan
name
(param 2), platform memeriksa apakah database ada atau tidak dan jika database ada, ia mendapatkan informasi versi dari header file database dan memicu panggilan balik yang tepatSeperti yang sudah dijelaskan dalam jawaban yang lebih lama, jika database dengan nama tidak ada, itu dipicu
onCreate
.Penjelasan di bawah ini menjelaskan
onUpgrade
kasus dengan contoh.Katakanlah, versi aplikasi pertama Anda memiliki versi
DatabaseHelper
(extendingSQLiteOpenHelper
) dengan konstruktor yang lewat sebagai1
dan kemudian Anda memberikan aplikasi yang ditingkatkan dengan kode sumber baru setelah versi berlalu2
, kemudian secara otomatis ketikaDatabaseHelper
dibangun, platform memicuonUpgrade
dengan melihat file yang sudah ada, tetapi versi ini lebih rendah dari versi saat ini yang telah Anda lewati.Sekarang katakan Anda berencana untuk memberikan versi ketiga aplikasi dengan versi db sebagai
3
(versi db hanya meningkat ketika skema database akan dimodifikasi). Dalam peningkatan bertahap seperti itu, Anda harus menulis logika pemutakhiran dari setiap versi secara bertahap untuk mendapatkan kode yang dapat dikelola dengan lebih baikContoh kode semu di bawah ini:
Perhatikan
break
pernyataan yang hilang dalam kasus1
dan2
. Inilah yang saya maksud dengan peningkatan bertahap.Katakan jika versi yang lama
2
dan versi yang baru4
, maka logikanya akan memutakhirkan basis data dari2
ke3
dan kemudian ke4
Jika versi lama adalah
3
dan versi baru ini4
, itu hanya akan menjalankan logika upgrade untuk3
ke4
sumber
onCreate()
Ketika kita membuat DataBase pada pertama kalinya (mis. Basis Data tidak ada)
onCreate()
buat basis data dengan versi yang diteruskanSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
Metode membuat tabel yang telah Anda tetapkan dan menjalankan kode lain yang Anda tulis. Namun, metode ini hanya akan dipanggil jika file SQLite hilang di direktori data aplikasi Anda (/data/data/your.apps.classpath/databases
).Metode ini tidak akan dipanggil jika Anda telah mengubah kode Anda dan diluncurkan kembali di emulator. Jika Anda ingin
onCreate()
menjalankan Anda harus menggunakan adb untuk menghapus file database SQLite.onUpgrade()
SQLiteOpenHelper
harus memanggil konstruktor super.onUpgrade()
Metode hanya akan dipanggil saat versi bilangan bulat lebih besar dari versi saat berjalan di app.onUpgrade()
metode dipanggil, Anda perlu menambahkan nomor versi dalam kode Anda.sumber
Mungkin saya terlambat tetapi saya ingin membagikan jawaban singkat dan manis saya. Silakan periksa Jawab untuk masalah yang sama. Itu pasti akan membantu Anda. Tidak ada spesifikasi yang lebih dalam.
Jika Anda yakin tentang sintaks untuk membuat tabel, daripada yang mungkin terjadi ketika Anda menambahkan kolom baru di tabel yang sama, untuk itu ...
1) Hapus instalasi dari perangkat Anda dan jalankan lagi.
ATAU
2) Pengaturan -> aplikasi -> ClearData
ATAU
3) Ubah
DATABASE_VERSION
kelas "DatabaseHandler" Anda (Jika Anda telah menambahkan kolom baru maka akan ditingkatkan secara otomatis)ATAU
4) Ubah
DATABASE_NAME
kelas "DatabaseHandler" Anda (saya menghadapi masalah yang sama. Tetapi saya berhasil dengan mengubahDATABASE_NAME
.)sumber
Poin yang perlu diingat saat memperpanjang
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Ini harus dipanggil baris pertama konstruktoronCreate
danonUpgrade
(jika perlu)onCreate
akan dipanggil hanya ketikagetWritableDatabase()
ataugetReadableDatabase()
dieksekusi. Dan ini hanya akan dipanggil sekali ketikaDBName
ditentukan pada langkah pertama tidak tersedia. Anda bisa menambahkan membuat kueri tabel padaonCreate
metodeDBversion
dan lakukan pertanyaan dalamonUpgrade
tabel atau cukup uninstall lalu instal aplikasi.sumber
onCreate dipanggil untuk pertama kalinya ketika pembuatan tabel diperlukan. Kita perlu mengganti metode ini di mana kita menulis skrip untuk pembuatan tabel yang dieksekusi oleh SQLiteDatabase. metode execSQL Setelah mengeksekusi dalam penyebaran pertama kali, metode ini tidak akan dipanggil seterusnya.
onUpgrade Metode ini dipanggil ketika versi database ditingkatkan. Misalkan untuk penyebaran pertama kali, versi database adalah 1 dan di penyebaran kedua ada perubahan dalam struktur database seperti menambahkan kolom tambahan dalam tabel. Misalkan versi database adalah 2 sekarang.
sumber
Anda dapat membuat basis data & tabel seperti
Catatan: jika Anda ingin membuat tabel lain atau menambahkan kolom atau tidak ada tabel seperti itu, cukup tambahkan VERSI
sumber
Database Sqlite mengesampingkan dua metode
1) onCreate (): Metode ini dipanggil hanya sekali ketika aplikasi dimulai pada kali pertama. Jadi itu disebut hanya sekali
2) onUpgrade () Metode ini dipanggil ketika kita mengubah versi database, maka metode ini dipanggil. Ini digunakan untuk mengubah struktur tabel seperti menambahkan kolom baru setelah membuat DB Schema
sumber
tidak ada tabel yang ditemukan terutama ketika Anda belum membuka
SQLiteOpenHelper
kelas dengangetwritabledata()
dan sebelum ini Anda juga harus memanggil make constructor dengan databasename & versi. DanOnUpgrade
dipanggil setiap kali ada nilai upgrade dalam nomor versi yang diberikan diSQLiteOpenHelper
kelas.Berikut ini cuplikan kode (Tidak ditemukan kolom seperti itu karena ejaan dalam nama kolom):
sumber
Jika Anda lupa untuk memberikan string "nama" sebagai argumen kedua ke konstruktor, itu menciptakan database "dalam memori" yang terhapus ketika Anda menutup aplikasi.
sumber
Copot aplikasi Anda dari emulator atau perangkat. Jalankan aplikasi lagi. (OnCreate () tidak dieksekusi ketika database sudah ada)
sumber
Nama database Anda harus diakhiri dengan .db juga string kueri Anda harus memiliki terminator (;)
sumber
Periksa kembali pertanyaan Anda di kelas DatabaseHandler / DatabaseManager Anda (yang pernah Anda ambil)
sumber
Dalam kasus saya, saya mendapatkan item dari file XML dengan
<string-array>
, tempat saya menyimpan<item>
. Dalam<item>
s ini saya memegang string SQL dan menerapkan satu-per-satu dengandatabaseBuilder.addMigrations(migration)
. Saya membuat satu kesalahan, lupa menambahkan\
sebelum penawaran dan mendapatkan pengecualian:android.database.sqlite.SQLiteException: tidak ada kolom seperti itu: some_value (kode 1 SQLITE_ERROR):, saat mengompilasi: INSERT INTO table_name (id, name) VALUES (1, some_value)
Jadi, ini adalah varian yang tepat:
sumber
Metode Sqliteopenhelper memiliki metode membuat dan memutakhirkan, membuat digunakan ketika setiap tabel pertama kali dibuat dan metode pemutakhiran akan dipanggil setiap kali setiap kali jumlah kolom tabel diubah.
sumber