Jika aplikasi Anda membutuhkan database dan disertai dengan data bawaan, apa cara terbaik untuk mengirimkan aplikasi itu? Haruskah saya:
Membuat ulang database SQLite dan memasukkannya ke dalam
.apk
?Sertakan perintah SQL dengan aplikasi dan minta dibuat database dan masukkan data pada penggunaan pertama?
Kelemahan yang saya lihat adalah:
Kemungkinan ketidaksesuaian versi SQLite dapat menyebabkan masalah dan saya saat ini tidak tahu ke mana database harus pergi dan bagaimana mengaksesnya.
Mungkin perlu waktu sangat lama untuk membuat dan mengisi basis data pada perangkat.
Ada saran? Pointer ke dokumentasi tentang masalah apa pun akan sangat dihargai.
android
android-sqlite
android-database
Heikki Toivonen
sumber
sumber
Jawaban:
Ada dua opsi untuk membuat dan memperbarui basis data.
Salah satunya adalah membuat database secara eksternal, lalu menempatkannya di folder aset proyek dan kemudian menyalin seluruh database dari sana. Ini jauh lebih cepat jika database memiliki banyak tabel dan komponen lainnya. Peningkatan dipicu dengan mengubah nomor versi database dalam file res / values / strings.xml. Upgrade kemudian akan dilakukan dengan membuat database baru secara eksternal, mengganti database lama di folder aset dengan database baru, menyimpan database lama di penyimpanan internal dengan nama lain, menyalin database baru dari folder aset ke penyimpanan internal, mentransfer semua dari data dari database lama (yang diubah namanya sebelumnya) ke dalam database baru dan akhirnya menghapus database lama. Anda dapat membuat database dengan menggunakanPlugin SQLite Manager FireFox untuk mengeksekusi pernyataan sql kreasi Anda.
Pilihan lainnya adalah membuat database secara internal dari file sql. Ini tidak secepat tetapi penundaan mungkin tidak akan terlihat oleh pengguna jika database hanya memiliki beberapa tabel. Peningkatan dipicu dengan mengubah nomor versi database dalam file res / values / strings.xml. Upgrade kemudian akan dilakukan dengan memproses file sql upgrade. Data dalam database akan tetap tidak berubah kecuali ketika wadahnya dihapus, misalnya menjatuhkan tabel.
Contoh di bawah ini menunjukkan cara menggunakan kedua metode tersebut.
Berikut adalah contoh file create_database.sql. Itu akan ditempatkan di folder aset proyek untuk metode internal atau disalin ke "Execute SQL 'dari SQLite Manager untuk membuat database untuk metode eksternal. (CATATAN: Perhatikan komentar tentang tabel yang diperlukan oleh Android.)
Ini adalah contoh file update_database.sql. Itu akan ditempatkan di folder aset proyek untuk metode internal atau disalin ke "Execute SQL 'dari SQLite Manager untuk membuat database untuk metode eksternal. (CATATAN: Perhatikan bahwa ketiga jenis komentar SQL akan diabaikan oleh parser sql yang termasuk dalam contoh ini.)
Berikut adalah entri untuk menambahkan ke file /res/values/strings.xml untuk nomor versi database.
Berikut adalah aktivitas yang mengakses database dan kemudian menggunakannya. ( Catatan: Anda mungkin ingin menjalankan kode database di utas terpisah jika menggunakan banyak sumber daya. )
Berikut adalah kelas pembantu database di mana database dibuat atau diperbarui jika perlu. (CATATAN: Android mengharuskan Anda membuat kelas yang memperluas SQLiteOpenHelper untuk bekerja dengan database Sqlite.)
Berikut kelas FileHelper yang berisi metode untuk menyalin file byte stream dan parsing file sql.
sumber
The
SQLiteAssetHelper
library membuat tugas ini benar-benar sederhana.Sangat mudah untuk ditambahkan sebagai dependensi gradle (tetapi Jar juga tersedia untuk Ant / Eclipse), dan bersama dengan dokumentasinya dapat ditemukan di:
https://github.com/jgilfelt/android-sqlite-asset-helper
Catatan: Proyek ini tidak lagi dikelola seperti yang disebutkan pada tautan Github di atas.
Sebagaimana dijelaskan dalam dokumentasi:
Tambahkan dependensi ke file build gradle modul Anda:
Salin database ke direktori aset, di subdirektori bernama
assets/databases
. Contohnya:assets/databases/my_database.db
(Secara opsional, Anda dapat mengompres database dalam file zip seperti
assets/databases/my_database.zip
. Ini tidak diperlukan, karena APK sudah dikompresi secara keseluruhan.)Buat kelas, misalnya:
sumber
Solusi saya tidak menggunakan pustaka pihak ketiga atau memaksa Anda untuk memanggil metode kustom pada
SQLiteOpenHelper
subkelas untuk menginisialisasi database saat pembuatan. Ini juga menangani peningkatan basis data juga. Yang perlu dilakukan hanyalah subclassSQLiteOpenHelper
.Prasyarat:
android_metadata
dengan atribut yanglocale
memiliki nilaien_US
selain tabel yang unik untuk aplikasi Anda.Subklasifikasi
SQLiteOpenHelper
:SQLiteOpenHelper
.private
metode dalamSQLiteOpenHelper
subclass. Metode ini berisi logika untuk menyalin konten database dari file database di folder 'aset' ke database yang dibuat dalam konteks paket aplikasi.onCreate
,onUpgrade
danonOpen
metodeSQLiteOpenHelper
.Cukup kata. Ini dia
SQLiteOpenHelper
subclass:Akhirnya, untuk mendapatkan koneksi basis data, panggil saja
getReadableDatabase()
ataugetWritableDatabase()
padaSQLiteOpenHelper
subkelas dan itu akan mengurus pembuatan db, menyalin konten db dari file yang ditentukan dalam folder 'aset', jika database tidak ada.Singkatnya, Anda dapat menggunakan
SQLiteOpenHelper
subkelas untuk mengakses db yang dikirimkan dalam folder aset sama seperti yang Anda gunakan untuk database yang diinisialisasi dengan menggunakan query SQL dalamonCreate()
metode ini.sumber
Mengirim aplikasi dengan file database, di Android Studio 3.0
Mengirim aplikasi dengan file database adalah ide yang bagus untuk saya. Keuntungannya adalah Anda tidak perlu melakukan inisialisasi yang kompleks, yang terkadang menghabiskan banyak waktu, jika kumpulan data Anda sangat besar.
Langkah 1: Siapkan file database
Siapkan file database Anda. Ini bisa berupa file .db atau .sqlite. Jika Anda menggunakan file .sqlite, yang perlu Anda lakukan adalah mengubah nama ekstensi file. Langkah-langkahnya sama.
Dalam contoh ini, saya menyiapkan file bernama testDB.db. Ini memiliki satu tabel dan beberapa sampel data di dalamnya seperti ini
Langkah 2: Impor file ke proyek Anda
Buat folder aset jika Anda belum memilikinya. Kemudian salin dan tempel file database ke folder ini
Langkah 3: Salin file ke folder data aplikasi
Anda perlu menyalin file database ke folder data aplikasi untuk melakukan interaksi lebih lanjut dengannya. Ini adalah tindakan satu kali (inisialisasi) untuk menyalin file database. Jika Anda memanggil kode ini beberapa kali, file database di folder data akan ditimpa oleh yang ada di folder aset. Proses menimpa ini berguna ketika Anda ingin memperbarui basis data di masa depan selama pembaruan aplikasi.
Perhatikan bahwa selama pembaruan aplikasi, file database ini tidak akan diubah di folder data aplikasi. Hanya uninstall yang akan menghapusnya.
File database perlu disalin ke
/databases
folder. Buka Device File Explorer. Masukkandata/data/<YourAppName>/
lokasi. Ini adalah folder data default aplikasi yang disebutkan di atas. Dan secara default, file database akan ditempatkan di folder lain yang disebut database di bawah direktori iniSekarang, proses menyalin file cukup banyak seperti apa yang dilakukan Java. Gunakan kode berikut untuk melakukan copy paste. Ini adalah kode inisiasi. Itu juga dapat digunakan untuk memperbarui (dengan menimpa) file database di masa depan.
Kemudian segarkan folder untuk memverifikasi proses penyalinan
Langkah 4: Buat database open helper
Buat subclass untuk
SQLiteOpenHelper
, dengan connect, close, path, dll. Saya menamainyaDatabaseOpenHelper
Langkah 5: Buat kelas tingkat atas untuk berinteraksi dengan database
Ini akan menjadi kelas yang membaca & menulis file database Anda. Juga ada permintaan sampel untuk mencetak nilai dalam database.
Langkah 6: Uji coba
Uji kode dengan menjalankan baris kode berikut.
Tekan tombol run dan bersoraklah!
sumber
Pada November 2017 Google merilis Perpustakaan Persistence Room .
Dari dokumentasi:
Database Kamar memiliki panggilan balik ketika database pertama kali dibuat atau dibuka. Anda dapat menggunakan buat panggilan balik untuk mengisi basis data Anda.
Kode dari posting blog ini .
sumber
Dari apa yang saya lihat Anda harus mengirim database yang sudah memiliki pengaturan tabel dan data. Namun jika Anda menginginkannya (dan tergantung pada jenis aplikasi yang Anda miliki), Anda dapat mengizinkan "pemutakhiran opsi basis data". Kemudian yang Anda lakukan adalah mengunduh versi sqlite terbaru, dapatkan pernyataan Sisipkan / Buat terbaru dari file teks yang dihosting online, jalankan pernyataan dan lakukan transfer data dari db lama ke yang baru.
sumber
Akhirnya saya berhasil !! Saya telah menggunakan bantuan tautan ini Menggunakan database SQLite Anda sendiri di aplikasi Android , tetapi harus mengubahnya sedikit.
Jika Anda memiliki banyak paket, Anda harus meletakkan nama paket master di sini:
private static String DB_PATH = "data/data/masterPakageName/databases";
Saya mengubah metode yang menyalin database dari folder lokal ke folder emulator! Ada beberapa masalah ketika folder itu tidak ada. Jadi pertama-tama, itu harus memeriksa jalan dan jika tidak ada, itu harus membuat folder.
Dalam kode sebelumnya,
copyDatabase
metode tidak pernah dipanggil ketika database tidak ada dancheckDataBase
metode ini menyebabkan pengecualian. jadi saya mengubah sedikit kode.Jika database Anda tidak memiliki ekstensi file, jangan gunakan nama file dengan ekstensi file.
itu bekerja baik untuk saya, saya harap ini akan berguna bagi Anda juga
sumber
Saat ini tidak ada cara untuk membuat database SQLite untuk dikirimkan dengan apk Anda. Yang terbaik yang dapat Anda lakukan adalah menyimpan SQL yang sesuai sebagai sumber daya dan menjalankannya dari aplikasi Anda. Ya, ini mengarah pada duplikasi data (informasi yang sama ada sebagai resrouce dan sebagai database) tetapi tidak ada cara lain saat ini. Satu-satunya faktor yang meringankan adalah file apk dikompresi. Pengalaman saya adalah kompres 908KB menjadi kurang dari 268KB.
Utas di bawah ini memiliki diskusi / solusi terbaik yang saya temukan dengan kode sampel yang baik.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
Saya menyimpan pernyataan CREATE saya sebagai sumber daya string untuk dibaca dengan Context.getString () dan menjalankannya dengan SQLiteDatabse.execSQL ().
Saya menyimpan data untuk sisipan saya di res / raw / inserts.sql (saya membuat file sql, 7000+ baris). Dengan menggunakan teknik dari tautan di atas, saya memasukkan loop, membaca file baris demi baris dan menggabungkan data ke "INSERT INTO tbl VALUE" dan melakukan SQLiteDatabase.execSQL () lainnya. Tidak ada gunanya menyimpan 7000 "INSERT INTO tbl VALUE" ketika mereka baru saja dikonsolidasikan.
Dibutuhkan sekitar dua puluh detik pada emulator, saya tidak tahu berapa lama ini akan dilakukan pada telepon nyata, tetapi itu hanya terjadi sekali, ketika pengguna pertama kali memulai aplikasi.
sumber
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 baris sisipan harus memiliki 100 NILAI). Ini akan jauh lebih efisien dan akan mengurangi waktu startup Anda dari 20 detik menjadi 2 atau 3 detik.Mengirim database di dalam apk dan kemudian menyalinnya
/data/data/...
akan menggandakan ukuran database (1 di apk, 1 didata/data/...
), dan akan meningkatkan ukuran apk (tentu saja). Jadi database Anda tidak boleh terlalu besar.sumber
Android sudah menyediakan pendekatan manajemen basis data versi sadar. Pendekatan ini telah dimanfaatkan dalam kerangka kerja BARACUS untuk aplikasi Android.
Ini memungkinkan Anda untuk mengelola basis data di sepanjang siklus seluruh versi aplikasi, karena dapat memperbarui basis data sqlite dari versi sebelumnya ke versi saat ini.
Juga, ini memungkinkan Anda untuk menjalankan hot-backup dan hot-recovery dari SQLite.
Saya tidak 100% yakin, tetapi pemulihan panas untuk perangkat tertentu memungkinkan Anda untuk mengirim basis data yang sudah disiapkan di aplikasi Anda. Tetapi saya tidak yakin tentang format biner basis data yang mungkin spesifik untuk perangkat, vendor, atau generasi perangkat tertentu.
Karena masalahnya adalah Apache License 2, jangan ragu untuk menggunakan kembali bagian mana pun dari kode, yang dapat ditemukan di github
EDIT:
Jika Anda hanya ingin mengirimkan data, Anda dapat mempertimbangkan untuk memulai dan bertahan POJO pada aplikasi pertama kali mulai. BARACUS mendapat dukungan bawaan untuk ini (penyimpanan nilai kunci bawaan untuk info konfigurasi, mis. "APP_FIRST_RUN" ditambah pengait bootstrap setelah konteks untuk menjalankan operasi pasca peluncuran pada konteks). Ini memungkinkan Anda untuk memiliki data yang digabungkan ketat dengan aplikasi Anda; dalam banyak kasus ini cocok dengan kasus penggunaan saya.
sumber
Jika data yang diperlukan tidak terlalu besar (batas yang saya tidak tahu, akan tergantung pada banyak hal), Anda juga dapat mengunduh data (dalam XML, JSON, apa pun) dari situs web / webapp. Setelah menerima, jalankan pernyataan SQL menggunakan data yang diterima membuat tabel Anda dan memasukkan data.
Jika aplikasi seluler Anda berisi banyak data, nanti akan lebih mudah untuk memperbarui data di aplikasi yang diinstal dengan data atau perubahan yang lebih akurat.
sumber
Saya memodifikasi kelas dan jawaban untuk pertanyaan dan menulis kelas yang memungkinkan memperbarui basis data melalui DB_VERSION.
Menggunakan kelas.
Di kelas aktivitas, deklarasikan variabel.
Dalam metode onCreate, tulis kode berikut.
Jika Anda menambahkan file database ke folder res / raw kemudian gunakan modifikasi kelas berikut.
http://blog.harrix.org/article/6784
sumber
Saya menulis perpustakaan untuk menyederhanakan proses ini.
Ini akan membuat dataBase dari
assets/databases/myDb.db
file. Selain itu, Anda akan mendapatkan semua fungsionalitas itu:Kloning dari github .
sumber
Saya menggunakan ORMLite dan kode di bawah ini berfungsi untuk saya
Harap dicatat, Kode mengekstrak file database dari file zip di aset
sumber