Pro dan Kontra dari SQLite dan Preferensi Bersama [ditutup]

156

Apa mekanisme yang baik untuk menyimpan informasi di antara basis data SQLite dan Preferensi Bersama?

Mengapa menggunakan preferensi bersama? Mengapa menggunakan sqlite? Saya mencoba menemukan perbedaan di antara mereka, dan mana yang merupakan mekanisme penyimpanan data yang lebih baik, tetapi saya tidak dapat menemukan jawaban yang sesuai di Google. Tolong bantu saya dengan contoh dan penjelasan.

Rana
sumber
Cukup banyak tergantung pada jenis data yang ingin Anda simpan. SharedPreferences memungkinkan akses data yang lebih cepat dan sederhana, lebih nyaman digunakan saat menyimpan sejumlah kecil data.
Egor
2
Jangan menyimpan apa pun di Preferensi Bersama kecuali string sederhana dan primitif - dan jika Anda menggunakan file terpisah untuk masing-masing - meskipun dokumen Preferensi Bersama tidak aman utas dan bahkan jika digunakan hanya pada utas utama yang sangat rawan korupsi jika Anda menyimpan lebih banyak dari 1 pasangan nilai kunci dalam file.
RunLoop
SharedPreferences di-cache dalam memori setelah penggunaan pertama, jadi mereka harus cukup cepat pada penggunaan Baca akibat.
Stan

Jawaban:

169

Ini sangat tergantung pada data yang ingin Anda simpan.

SQLite

Sejumlah besar data terstruktur yang sama harus disimpan dalam database SQLite karena database dirancang untuk data jenis ini. Karena data terstruktur dan dikelola oleh basis data, dapat ditanyakan untuk mendapatkan subset data yang cocok dengan kriteria tertentu menggunakan bahasa query seperti SQL. Ini memungkinkan pencarian dalam data. Tentu saja mengelola dan mencari set data yang besar memengaruhi kinerja sehingga membaca data dari database bisa lebih lambat daripada membaca data dari SharedPreferences.

SharedPreferences

SharedPreferences adalah penyimpanan kunci / nilai tempat Anda dapat menyimpan data dengan kunci tertentu. Untuk membaca data dari toko Anda harus mengetahui kunci dari data tersebut. Ini membuat membaca data sangat mudah. Tetapi semudah menyimpan sejumlah kecil data sama sulitnya dengan menyimpan dan membaca data terstruktur besar karena Anda perlu mendefinisikan kunci untuk setiap data, terlebih lagi Anda tidak dapat benar-benar mencari di dalam data kecuali Anda memiliki konsep tertentu untuk memberi nama kunci.

Flo
sumber
24
Untuk memberikan contoh, SharedPreferences berguna untuk menyimpan preferensi pengguna, di mana hanya ada beberapa variabel yang perlu disimpan. SQLite di sisi lain akan lebih baik untuk menyimpan data di mana ada banyak item, seperti judul lagu di perpustakaan musik yang perlu dicari.
CL22
5
Anda tidak perlu tahu nama-nama kunci untuk menggunakan SharedPreferences. Lihat getAll ().
ZaBlanc
5
FYI, ada opsi KETIGA: baca / tulis XML ke file. (Lihat kelas android.util.xml). Cocok untuk data yang cukup kompleks yang dapat dibaca / ditulis sekaligus. Misalnya, kisi nilai yang tidak sering diubah pengguna. Terutama jika itu adalah data yang nantinya ingin Anda kirim ke tempat lain, sehingga perlu dalam format yang dapat diuraikan.
ToolmakerSteve
1
Apakah disarankan untuk menyimpan json sebagai string json di pref bersama?
Kaveesh Kanwal
2
@ JCarlos Selama Anda tidak melakukan beberapa proses lintas proses, Anda akan baik-baik saja menggunakan SharedPreferences.
Mygod
97

Pertanyaan ini memiliki jawaban yang diterima, tetapi saya pikir ada lebih banyak untuk dikatakan pada topik - mengenai kecepatan.

SharedPreferences dan Sqlite DB aplikasi keduanya merupakan file, disimpan dalam direktori aplikasi pada sistem file perangkat. Jika jumlah data tidak terlalu besar, opsi Sqlite akan melibatkan file yang lebih besar dan lebih rumit dengan lebih banyak pemrosesan overhead untuk akses sederhana.

Jadi, jika sifat data tidak menentukan pilihan Anda (seperti yang dijelaskan dalam jawaban yang diterima), dan mempercepat, maka Anda mungkin lebih baik menggunakan SharedPreferences.

Dan membaca beberapa data sering kali berada di jalur kritis untuk menampilkan aktivitas utama, jadi saya pikir kecepatan seringkali sangat penting.

Satu pemikiran terakhir mengenai kecepatan dan efisiensi - jika Anda perlu menggunakan database Sqlite untuk beberapa data terstruktur maka mungkin lebih efisien untuk juga menyimpan preferensi pengguna dalam database sehingga Anda tidak membuka file kedua. Ini adalah pertimbangan yang cukup kecil - mungkin layak dipertimbangkan hanya jika Anda perlu mengakses data terstruktur dan preferensi sebelum Anda dapat menampilkan aktivitas utama.

Tom
sumber
6
Bagaimana dengan keterbacaan kode? Saya pikir ketika menyimpan beberapa catatan dalam SharedPrefs bukan tabel db, kode menjadi berbelit-belit. Sintaks Sql lebih mudah dibaca daripada mengulang entri SharedPrefs ...
IgorGanapolsky
8
Igor, aku tidak setuju. SharedPreferences benar-benar 1 dimensi, sangat mudah untuk menggunakan preferensi. Sebagai contoh, saya sedang membangun aplikasi pengecekan stok, saya hanya menyimpan simbol stok dalam preferensi. Saya tidak perlu mengambilnya secara individual, karena saya selalu mendaftar semuanya, dan ini yang saya lakukan, simpan atau ambil. Ini sangat sederhana, jauh lebih sederhana daripada menggunakan DB.
AutoM8R
1
Saya tidak bisa memikirkan situasi di mana pembacaan kode menjadi sulit sementara struktur data yang akan disimpan tidak menuntut penggunaan database hierarkis. Bahkan jika ada masalah keterbacaan dapat diselesaikan dengan menggunakan kelas pembungkus dengan fungsi yang diperlukan.
Sarath Sadasivan Pillai
1
Bisakah kita menyimpan beberapa nilai kunci dalam bentuk data jsonstring di bawah preferensi bersama? Apakah ada batas karakter yang dapat memotong nilai json saya?
Nova
2
SharedPreferences dimuat ke dalam memori hanya sekali (per siklus hidup proses aplikasi) dan disimpan di sana; setelah itu selalu super cepat. Jadi sebenarnya tidak ada kinerja praktis yang menang dengan memasukkan data SharedPref ke dalam SQLite (hanya demi menghindari akses file SharedPref tambahan). Dan omong-omong Anda tidak harus meletakkan barang-barang SQLite Anda ke dalam SharedPrefs; seperti yang saya katakan, selalu ada di memori yang dapat menyebabkan masalah (yang di luar memori).
Zsolt Safrany
20

Menurut saya, ini bukan tentang kecepatan atau ukuran tetapi jenis operasi yang ingin Anda lakukan untuk data Anda.

Jika Anda berencana untuk bergabung , mengurutkan , dan operasi DB lainnya pada data Anda, maka pergi untuk Sqlite . Contohnya adalah menyortir data berdasarkan tanggal.

Jika Anda ingin memetakan nilai sederhana (seperti int, boolean, String) maka gunakan Preferensi . Operasi DB tidak akan berfungsi di sini dan tidak perlu dikatakan Anda harus memiliki semua kunci. Contohnya adalah kata sandi pengguna atau konfigurasi aplikasi.

Godaan besar untuk merangkul Preferensi adalah ketika Anda ingin menggunakannya untuk menyimpan POJO yang diratakan (objek JSON berseri) sebagai String. Memiliki kebutuhan seperti itu sebenarnya adalah tanda untuk menggunakan Sqlite. Mengapa Karena data yang kompleks pada akhirnya akan membutuhkan operasi yang kompleks. Bayangkan mengambil entri tertentu yang dapat ditangani oleh "SELECT ... WHERE id = 1". Di jalur Preferensi, ini akan menjadi proses yang panjang dari deserializing hingga iterasi hasil.

inmyth
sumber
Juga, SharedPreferences tidak mendukung transaksi, jadi jika Anda memerlukan transaksi maka gunakan SQLite. Misalnya, jika pengguna menekan tombol "logout", Anda mungkin ingin menghapus beberapa SharedPreferenceskunci / nilai sekaligus (misalnya, kedua tombol userdan password), sehingga Anda yakin bahwa kedua tombol tidak disetel atau keduanya disetel.
runeks
5
  • Untuk menyimpan sejumlah besar data, gunakan sistem database SQLite. Ini akan memungkinkan pengguna untuk mencari data juga.

  • Di sisi lain, untuk menyimpan sejumlah kecil data, pilih Preferensi Bersama. Dalam hal ini, sistem basis data besar tidak diperlukan. Ini akan memungkinkan pengguna untuk hanya menyimpan data dan memuatnya.

Sami Al-Jabar
sumber
1
300 pasangan nilai kunci adalah sejumlah besar data? Saya harus menyimpannya dengan tepat.
JCarlosR
1
Dalam hal ini, Anda harus menggunakan database SQLite. Kalau tidak, akan sulit untuk mengelola dan mengambil 300 data itu.
Sami Al-Jabar
Tetapi jika semua kunci diketahui, bukankah akan lebih mudah untuk mengambil data dari Preferensi Bersama?
Arjun
-6

Lupakan SQLLite, lupakan SharedPreferences, gunakan Realm. Satu solusi untuk semua penyimpanan lokal Anda. Anda dapat menggunakan Java Objects biasa sebagai RealmObjects dan menyimpan data Anda di sana. Anda dapat mengubah kueri yang dipilih menjadi file JSON. Tidak perlu menguraikan seluruh basis data. Periksa tautan ini: https://realm.io/news/introducing-realm/

greenspand
sumber
12
lupakan semua yang Anda ketahui tentang slipcover.
Andrew G