Belajar Flutter dari Awal: Membangun Aplikasi Sederhana dengan Database (Part 10)
Rifqi An
Halo gaes! Balik lagi nih sama seri tutorial yang bikin tangan keriting tapi hati senang, Belajar Flutter dari Awal! Udah sampai Part 10 aja, gila cepet banget ya? Waktu emang nggak kerasa kalau lagi ngoding, apalagi kalau lagi ngejar deadline sambil ditemani secangkir kopi hitam dan lagu Lofi. Kali ini kita bakal nge-gaspol ke inti dari aplikasi apapun yang 'punya otak', apalagi kalau bukan... DATABASE!
Yup, di bagian kesepuluh dari seri Membangun Aplikasi Sederhana dengan Database ini, kita nggak cuma ngomongin teori lagi, tapi langsung "turun tangan" alias ngoprek codingan buat implementasi dasar-dasar interaksi database: CRUD (Create, Read, Update, Delete). Jadi, siap-siap jari pegal ya!
Daftar Isi
- Balik Lagi, Ngoding Database!
- Recap Kilat: Kita Udah Ngapain Aja?
- Mulai Ngoprek Data! (CRUD Basics)
- Error & Debugging: Teman Setia Programmer
- Next Step: Fitur-fitur Kece Lainnya!
- Latihan: Biar Makin Jago!
Balik Lagi, Ngoding Database!
Setelah kemarin kita sibuk ngenalin Flutter ke database (ibarat kenalan sama camer, penuh drama dan butuh banyak persiapan), sekarang waktunya bikin mereka 'berumah tangga' alias interaksi! Ini Part 10 dari seri Belajar Flutter dari Awal yang fokusnya ke Membangun Aplikasi Sederhana dengan Database. Jadi, kita akan bikin aplikasi kita bener-bener bisa menyimpan, mengambil, mengubah, dan menghapus data.
Bayangin, aplikasi kamu bukan lagi cuma tampilan doang, tapi udah punya "ingatan". Keren kan?
Recap Kilat: Kita Udah Ngapain Aja?
Sebelum loncat lebih jauh, inget-inget lagi ya, di part-part sebelumnya kita udah:
- Install paket
sqflitedanpath_provider(biar bisa mainan SQLite di Flutter). - Bikin kelas model data, misalnya
NoteModelatauTaskModel, yang merepresentasikan struktur tabel di database kita. - Setup
DatabaseHelper(atauDBProvider, suka-suka namanya) buat ngatur koneksi database dan skema tabel.
Kira-kira strukturnya kayak gini nih kalau kamu punya file note_model.dart dan database_helper.dart (ini contoh sederhana aja ya, mungkin di proyek kamu lebih kompleks):
// lib/models/note_model.dart
class Note {
int? id;
String title;
String content;
Note({this.id, required this.title, required this.content});
Map<String, dynamic> toMap() {
return {
'id': id,
'title': title,
'content': content,
};
}
factory Note.fromMap(Map<String, dynamic> map) {
return Note(
id: map['id'],
title: map['title'],
content: map['content'],
);
}
}
// lib/helpers/database_helper.dart
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import '../models/note_model.dart'; // Jangan lupa import modelnya
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper._internal();
static Database? _database;
factory DatabaseHelper() {
return _instance;
}
DatabaseHelper._internal();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'notes_app.db');
return await openDatabase(
path,
version: 1,
onCreate: (db, version) {
return db.execute(
"CREATE TABLE notes(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, content TEXT)",
);
},
);
}
// Nanti fungsi CRUD bakal ditaruh di sini!
}
Oke, kalau udah paham sampai sini, berarti kamu udah siap buat melangkah ke tahap selanjutnya: bikin si DatabaseHelper ini punya skill buat 'ngobrol' sama datanya. Yuk!
Mulai Ngoprek Data! (CRUD Basics)
CRUD itu singkatan dari Create, Read, Update, Delete. Intinya, kalau kamu mau bikin aplikasi yang datanya bisa disimpan, ditampilkan, diedit, atau dihapus, ya ini kuncinya! Semua aplikasi yang interaktif pasti pakai konsep ini. Mari kita bedah satu per satu.
Menambah Data (Create)
Nambah data itu kayak kamu lagi ngisi formulir biodata teman di buku kenangan, atau nulis catatan baru di buku harian. Kamu masukin data baru, lalu data itu disimpan di database. Di Flutter, biasanya ini terjadi setelah user mengisi form dan menekan tombol 'Simpan'.
// Di dalam class DatabaseHelper
Future<int> insertNote(Note note) async {
Database db = await database;
return await db.insert('notes', note.toMap());
}
Penjelasan singkat: Kita panggil metode insert() dari objek db (database). Parameter pertamanya adalah nama tabel ('notes'), dan yang kedua adalah data yang mau diinsert dalam bentuk Map<String, dynamic> yang didapat dari note.toMap(). Fungsi ini akan mengembalikan id dari baris yang baru ditambahkan.
Melihat Data (Read)
Setelah datanya masuk, masa nggak bisa dilihat? Nanti dikira aplikasi halu, haha! Bagian Read ini buat nampilin semua data yang ada di tabel, atau bisa juga cuma nyari data tertentu berdasarkan ID atau kriteria lain.
Melihat Semua Data
// Di dalam class DatabaseHelper
Future<List<Note>> getNotes() async {
Database db = await database;
List<Map<String, dynamic>> maps = await db.query('notes');
return List.generate(maps.length, (i) {
return Note.fromMap(maps[i]);
});
}
Penjelasan singkat: Metode query() akan mengambil semua baris dari tabel 'notes'. Hasilnya berupa List<Map<String, dynamic>>, yang kemudian kita ubah menjadi List<Note> menggunakan Note.fromMap().
Melihat Data Berdasarkan ID
// Di dalam class DatabaseHelper
Future<Note?> getNoteById(int id) async {
Database db = await database;
List<Map<String, dynamic>> maps = await db.query(
'notes',
where: 'id = ?',
whereArgs: [id],
);
if (maps.isNotEmpty) {
return Note.fromMap(maps.first);
}
return null;
}
Penjelasan singkat: Kita gunakan parameter where dan whereArgs untuk memfilter data. Tanda tanya (?) di where akan digantikan oleh nilai dari whereArgs.
Mengubah Data (Update)
Namanya juga hidup, kadang butuh di-update. Data juga gitu! Misal kamu salah ketik nama, atau mau ganti status tugas dari 'pending' jadi 'selesai'. Tinggal panggil fungsi ini, biasanya dengan menyertakan ID data yang mau di-update.
// Di dalam class DatabaseHelper
Future<int> updateNote(Note note) async {
Database db = await database;
return await db.update(
'notes',
note.toMap(),
where: 'id = ?',
whereArgs: [note.id],
);
}
Penjelasan singkat: Metode update() mirip dengan insert(), tapi kita tambahkan parameter where untuk menentukan baris mana yang akan di-update. Ingat, harus pakai id ya, biar nggak salah update data orang!
Menghapus Data (Delete)
Kalau udah nggak kepakai, atau mantan yang bikin kenangan buruk, ya dihapus aja! Data juga bisa dihapus biar database nggak penuh sampah (atau biar nggak baper). Sama seperti update, kita perlu ID untuk menghapus data tertentu.
// Di dalam class DatabaseHelper
Future<int> deleteNote(int id) async {
Database db = await database;
return await db.delete(
'notes',
where: 'id = ?',
whereArgs: [id],
);
}
Penjelasan singkat: Metode delete() hanya butuh nama tabel dan kriteria where. Kalau id yang dicari ketemu, datanya langsung lenyap dari muka bumi (database).
Error & Debugging: Teman Setia Programmer
Setelah implementasi CRUD ini, jangan sedih kalau tiba-tiba aplikasi kamu crash atau data nggak kesimpan. Itu bukan bug, itu fitur yang belum sempurna! Ngopi aja dulu, siapa tahu idenya keluar. Beberapa tips kalau lagi nyari bug:
- Gunakan
print()secara bijak: Ini cara paling lawas tapi ampuh buat ngelihat alur data dan nilai variabel. Tapi jangan banyak-banyak, nanti kode kamu kayak koran. - Manfaatkan Debugger: Flutter punya debugger yang powerful di VS Code atau Android Studio. Manfaatkan breakpoint buat melacak setiap baris kode.
try-catchBlok: Selalu pakaitry-catchuntuk operasi database yang berpotensi error (misal koneksi terputus, data tidak valid). Ini membantu aplikasi kamu nggak langsung crash total.- Logcat/Console: Perhatikan pesan error di console. Kadang stack trace-nya bisa nunjukkin di mana letak kesalahannya.
Ingat, debugging itu bagian dari seni ngoding. Kalau kamu belum pernah begadang semalaman cuma karena nyari titik koma yang hilang, berarti kamu belum jadi programmer sejati! (Becanda doang ya, jangan sampai begadang beneran kalau nggak penting-penting banget!)
Next Step: Fitur-fitur Kece Lainnya!
Oke, kamu udah jago nih di bagian belakang layar alias backend mini kita. Fungsi CRUD udah beres! Tapi kan aplikasi yang bagus itu nggak cuma bisa nyimpen data, tapi juga punya tampilan yang user-friendly. Nah, di part selanjutnya (atau mungkin beberapa part ke depan), kita bakal integrasiin fungsi-fungsi CRUD tadi ke UI Flutter-nya. Bayangin, kita bakal bikin:
- Daftar catatan/tugas yang bisa di-scroll.
- Form untuk menambah catatan baru.
- Halaman detail untuk melihat atau mengedit catatan yang sudah ada.
- Tombol 'Hapus' yang bikin deg-degan.
Pokoknya, dari data mentah di database, kita sulap jadi aplikasi yang interaktif dan bisa dipakai sehari-hari. Siap-siap ya!
Latihan: Biar Makin Jago!
Teori udah, kode udah, sekarang giliran kamu praktek biar makin jago! Kali ini, ceritanya kamu adalah admin sebuah komunitas pecinta kucing gemoy bernama "KucingMania". Setiap kucing punya data unik. Tugas kamu adalah:
- Buat model data baru bernama
KucingModel. Propertinya:id(int),nama(String),ras(String), dantanggalLahir(String, format 'YYYY-MM-DD' biar gampang). - Modifikasi
DatabaseHelper(atau bikin yang baru) untuk membuat tabelkucingdengan skema yang sesuai denganKucingModel. - Implementasikan fungsi
insertKucing(),getKucings()(ambil semua),getKucingById(),updateKucing(), dandeleteKucing(). - Coba panggil fungsi-fungsi tersebut di suatu tempat (misal di fungsi
main()atau di tombol temporer) untuk memastikan semua berjalan lancar. Coba tambahkan 3 kucing, ubah nama 1 kucing, dan hapus 1 kucing. Jangan lupaprint()hasilnya ya biar tahu berhasil atau enggak!
Kalau berhasil, kamu pahlawan KucingMania! Kalau error... ya itu tantangan biar kamu makin pinter! Semangat ngoding, jangan lupa ngopi!
.png)