SQL Primer

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, dan definition

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 columns FROM table WHERE 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, gunakan AND atau OR.

Bagian lain dari kueri:

  • ORDER BY: Frasa kunci opsional untuk mengurutkan hasil menurut kolom. Tentukan ASC untuk naik dan DESC 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";
rawQuery(query, null);

2

query = "SELECT word, definition FROM WORD_LIST_TABLE WHERE _id> ? ";
String[] selectionArgs = new String[]{"2"}
rawQuery(query, selectionArgs) ;

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
WHERE word="alpha"
ORDER BY word ASC LIMIT 2,1;

Kueri menampilkan hal berikut:

[["alpha", "particle"]]

Contoh argumen yang dapat Anda gunakan:

String table = "WORD_LIST_TABLE"
String[] columns = new String[]{"*"};
String selection = "word = ?"
String[] selectionArgs = new String[]{"alpha"};
String groupBy = null;
String having = null;
String orderBy = "word ASC"
String limit = "2,1"

query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

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