Hari 25: SQLite & Local Database
60 min
Last updated 09 Apr 2026
sqflite — SQLite untuk Flutter
// pubspec.yaml: sqflite: ^2.3.0, path: ^1.8.0
import "package:sqflite/sqflite.dart";
import "package:path/path.dart";
class DatabaseHelper {
static Database? _db;
static const _dbName = "todo.db";
static const _tableTodo = "todos";
static Future get database async {
_db ??= await _initDatabase();
return _db!;
}
static Future _initDatabase() async {
String path = join(await getDatabasesPath(), _dbName);
return openDatabase(path, version: 1, onCreate: _onCreate);
}
static Future _onCreate(Database db, int version) async {
await db.execute("""
CREATE TABLE $_tableTodo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
judul TEXT NOT NULL,
selesai INTEGER DEFAULT 0,
dibuat TEXT DEFAULT CURRENT_TIMESTAMP
)
""");
}
// CRUD
static Future tambah(String judul) async {
final db = await database;
return db.insert(_tableTodo, {"judul": judul, "selesai": 0});
}
static Future>> semua() async {
final db = await database;
return db.query(_tableTodo, orderBy: "dibuat DESC");
}
static Future selesaikan(int id) async {
final db = await database;
return db.update(_tableTodo, {"selesai": 1}, where: "id = ?", whereArgs: [id]);
}
static Future hapus(int id) async {
final db = await database;
return db.delete(_tableTodo, where: "id = ?", whereArgs: [id]);
}
}
💡
Notice: Pattern ini merepresentasikan sqflite API. Selalu gunakan parameterized queries untuk mencegah SQL injection.
Assignment
Buat simulasi SQLite CRUD dengan insert, update, delete, dan query berdasarkan filter.
Expected output:
=== Database (3 rows) ===
{judul: Belajar Dart, selesai: 0, id: 1}
{judul: Buat Flutter app, selesai: 0, id: 2}
{judul: Push ke GitHub, selesai: 0, id: 3}
Setelah update & delete:
=== Database (2 rows) ===
{judul: Belajar Dart, selesai: 0, id: 1}
{judul: Buat Flutter app, selesai: 1, id: 2}
Belum selesai:
{judul: Belajar Dart, selesai: 0, id: 1}
Dart
main.dart
Solution
Output