SQLite primer
Kursus Mengembangkan Aplikasi Android di Kotlin mengasumsikan bahwa Anda telah memahami subjek berikut:
- Database secara umum
- Database SQL secara khusus
- Bahasa SQL yang digunakan untuk berinteraksi dengan database
Halaman ini berlaku sebagai pengulang dan referensi singkat.
Database SQL
Database SQL menyimpan data dalam tabel baris dan kolom:
- Persimpangan baris dan kolom disebut bidang.
- Bidang berisi data, referensi ke kolom lain, atau referensi ke tabel lain.
- Setiap baris berisi satu entitas. Entitas diidentifikasi dengan ID unik yang biasanya digunakan sebagai kunci utamanya.
- Setiap kolom diidentifikasi dengan nama yang unik per tabel.
SQLite
SQLite menerapkan mesin database SQL yang memiliki karakteristik berikut:
- Berdiri sendiri (tidak memerlukan komponen lain)
- Tanpa server (tidak memerlukan server backend)
- Konfigurasi nol (tidak perlu dikonfigurasi untuk aplikasi Anda)
- Transaksional (perubahan di dalam satu transaksi di SQLite diterapkan seluruhnya atau tidak sama sekali)
SQLite adalah mesin database yang paling banyak diterapkan di seluruh dunia. Kode sumber untuk SQLite berada di domain publik. Untuk mengetahui detail database SQLite, lihat situs SQLite.
Tabel contoh
- Database bernama
DATABASE_NAME
- Tabel bernama
WORD_LIST_TABLE
- Kolom untuk
_id
,word
, dandefinition
Setelah menyisipkan kata alpha
dan beta
, dengan
alpha
memiliki dua definisi, tabel mungkin terlihat seperti ini:
DATABASE_NAME
WORD_LIST_TABLE | ||
_id |
word |
definition |
1 |
"alpha" |
"first letter" |
2 |
"beta" |
"second letter" |
3 |
"alpha" |
"particle" |
Untuk menemukan apa yang ada dalam baris tertentu, gunakan _id
, atau ambil baris
dengan merumuskan kueri yang memilih baris dari tabel dengan menentukan
batasan.
Transaksi
Transaksi adalah urutan operasi yang dijalankan sebagai satu unit kerja logis. Untuk memenuhi syarat sebagai transaksi, unit kerja logis harus terdiri dari empat properti: atomisitas, konsistensi, isolasi, dan ketahanan (ACID):
- Atomitas. Semua modifikasi data transaksi dijalankan, atau tidak ada yang dijalankan. Atomitas adalah true meskipun program mengalami error, error pada sistem operasi, atau kegagalan daya mengganggu tindakan penulisan perubahan ke disk.
- Konsistensi. Saat selesai, transaksi harus membiarkan semua data dalam keadaan konsisten.
- Isolasi. Modifikasi yang dilakukan oleh transaksi serentak harus diisolasi dari modifikasi yang dilakukan oleh transaksi serentak lainnya. Transaksi mengenali data dalam keadaan saat data dimasukkan sebelum transaksi serentak lain memodifikasinya, atau transaksi tersebut mengenali data setelah transaksi kedua selesai. Transaksi tidak mengenali status perantara.
- Ketahanan. Setelah transaksi selesai, efeknya secara permanen diterapkan dalam sistem. Modifikasi tetap ada bahkan jika terjadi kegagalan sistem.
Contoh transaksi:
- Mengirimkan uang dari rekening tabungan ke rekening giro.
- Memasukkan suatu istilah dan definisi ke dalam kamus.
- Mengikat changelist ke cabang utama.
Untuk mengetahui informasi selengkapnya tentang transaksi, lihat Atomic Commit di SQLite.
Bahasa kueri
Anda akan menggunakan bahasa kueri SQL untuk berinteraksi dengan database. Kueri bisa sangat rumit, tetapi ada empat operasi dasar:
- Menyisipkan baris
- Menghapus baris
- Memperbarui nilai dalam baris
- Mengambil baris yang memenuhi kriteria tertentu
Di Android, objek akses data (DAO) menyediakan metode yang mudah untuk menyisipkan, menghapus, dan memperbarui database. Untuk deskripsi lengkap tentang bahasa kueri, lihat SQL Seperti yang Dipahami oleh SQLite.
Struktur kueri
Kueri SQL memiliki sifat yang sangat terstruktur. Contoh kueri:
SELECT word, definition FROM WORD_LIST_TABLE WHERE word="alpha"
Versi generik dari kueri contoh:
SELECT
columnsFROM
tableWHERE
column="value"
Bagian dari kueri contoh:
SELECT
columns: Memilih kolom untuk dikembalikan. Gunakan*
untuk menampilkan semua kolom.FROM
table: Menentukan tabel yang dipakai untuk mendapatkan hasil.WHERE
: Kata kunci opsional yang mendahului ketentuan yang harus dipenuhi, misalnya column="value". Operator umum adalah=
,LIKE
,<
, dan>
. Untuk menghubungkan beberapa ketentuan, gunakanAND
atauOR
.
Bagian lain dari kueri:
ORDER BY
: Frasa kunci opsional untuk mengurutkan hasil menurut kolom. TentukanASC
untuk naik danDESC
untuk menurun. Jika tidak menentukan urutan, Anda akan mendapatkan urutan default, yang mungkin tidak berurutan.LIMIT
: Kata kunci untuk menentukan jumlah hasil yang terbatas.
Kueri contoh dan hasil
Kueri berikut menggunakan tabel yang ditentukan sebelumnya:
SELECT * FROM WORD_LIST_TABLE |
Mendapatkan semua baris dalam tabel WORD_LIST_TABLE . |
SELECT word, definition FROM WORD_LIST_TABLE WHERE _id > 2 | Memilih kolom word dan definition dari semua
item dengan id yang lebih besar dari 2. Menampilkan [["alpha", "particle"]] |
SELECT _id FROM WORD_LIST_TABLE WHERE word="alpha" AND definition LIKE "%art%" |
Menampilkan id dari kata alpha dengan substring art dalam definisi. [["3"]] |
SELECT definition FROM WORD_LIST_TABLE ORDER BY word DESC LIMIT 1 |
Memilih semua definisi. Mengurutkan secara terbalik dan mendapatkan baris pertama setelah
daftar diurutkan. Pengurutan menurut kolom yang ditentukan yang berupa
word . Perhatikan bahwa kita dapat mengurutkan berdasarkan kolom yang tidak
ditampilkan.[["second letter"]] |
SELECT * FROM WORD_LIST_TABLE LIMIT 2,1 |
Mengembalikan 1 item yang dimulai dari posisi 2. Penghitungan posisi dimulai dari 1 (bukan
nol.). Menampilkan [["2", "beta", "second letter"]] |
Anda dapat berlatih untuk membuat dan membuat kueri database di situs Fiddler SQL.
Kueri untuk Android SQLite
Anda dapat mengirimkan kueri ke database SQLite sistem Android sebagai kueri mentah atau sebagai parameter.
Metode rawQuery(String
sql, String[] selectionArgs)
menjalankan SQL yang disediakan. Metode ini menampilkan Cursor
dari kumpulan hasil. Tabel berikut menampilkan bagaimana dua kueri contoh pertama
dari tabel di atas akan terlihat sebagai kueri mentah:
1 |
String query = "SELECT * FROM WORD_LIST_TABLE"; |
2 |
query = "SELECT word, definition FROM WORD_LIST_TABLE WHERE _id> ? "; |
Metode query(String
table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having, String orderBy, String limit)
membuat kueri tabel yang diberikan. Metode ini menampilkan Cursor
pada
kumpulan hasil. Berikut adalah kueri yang menampilkan cara mengisi argumen:
SELECT * FROM WORD_LIST_TABLE |
Kueri menampilkan hal berikut:
[["alpha", "particle"]] |
Contoh argumen yang dapat Anda gunakan:
String table = "WORD_LIST_TABLE" |
Catatan: Dalam kode yang sebenarnya, Anda tidak akan membuat
variabel untuk
nilai null
. Lihat dokumentasi SQLiteDatabase
Android
untuk versi metode ini dengan parameter yang berbeda.
Kursor
Kursor adalah pointer ke baris data yang terstruktur. Anda dapat menganggap kursor sebagai pointer ke baris tabel.
Kueri menampilkan objek
Cursor
yang menunjuk ke elemen pertama dalam hasil kueri. Kelas
Cursor
menyediakan metode untuk memindahkan kursor melalui
hasil kueri, dan metode untuk mendapatkan data dari kolom setiap baris dalam
hasil.
Jika metode mengembalikan objek Cursor
, ulangi
hasil, ekstrak data, proses data, dan tutup kursor untuk
melepaskan memori.
Pelajari lebih lanjut
- Situs SQLite
- Deskripsi lengkap SQL seperti yang dipahami oleh SQLite
- Class
SQLiteDatabase
- Class
Cursor