Kumpulan Package Penyimpanan Lokal untuk Flutter
Database lokal pada pengembangan aplikasi mobile adalah database yang berjalan di perangkat pengguna. Database lokal tidak membutuhkan web api untuk diakses. Oleh karena, itu database lokal merupakan tool yang sangat berguna. Biasanya database lokal digunakan untuk menyimpan setelan pengguna, sebagai cache, atau sebagai database utama pada aplikasi yang memang offline.
Berikut adalah beberapa database lokal yang populer untuk Flutter.
Sqflite
Implementasi SQLite untuk flutter. Plugin ini dapat bekerja pada Andoird, iOS, & MacOS
Fitur:
- Transaction dan batch
- Version management
- Helper untuk queri insert/select/update/delete
- Operasi database berjalan pada background thread
Contoh Penggunaan
Membuka database
// Get a location using getDatabasesPath
final databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');
// open the database
Database database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
// When creating the db, create the table
await db.execute(
'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});
Membuat query dengan SQL
List<Map> list = await database.rawQuery('SELECT * FROM Test');
Melakukan Insert dengan transaction
// Insert some records in a transaction
await database.transaction((txn) async {
int id1 = await txn.rawInsert(
'INSERT INTO Test(name, value, num) VALUES("some name", 1234, 456.789)');
print('inserted1: $id1');
int id2 = await txn.rawInsert(
'INSERT INTO Test(name, value, num) VALUES(?, ?, ?)',
['another name', 12345678, 3.1416]);
print('inserted2: $id2');
});
Informasi selengkapnya dapat dipelajari di halaman pub.dev sqflite
Hive
Hive adalah database dengan jenis key-value pair yang diklaim penulisnya memiliki performa yang tinggi.
Fitur:
- Mendukung semua platform Flutter
- Performan
- API yang mudah & intuitif
- Dilengkapi enkripsi
- Murni Dart
Penggunaan
Box adalah tempat key-value disimpan. Penggunaan Hive mirip dengan menggunakan Map.
var box = Hive.box('myBox');
box.put('name', 'David');
var name = box.get('name');
print('Name: $name');
Menyimpan Objek
Tidak hanya primitif dan collection, Hive juga dapat menyimpan sembarang objek. Buat adapter dengan menambahkan anotasi pada class objek yang ingin disimpan.
@HiveType(typeId: 0)
class Person extends HiveObject {
@HiveField(0)
String name;
@HiveField(1)
int age;
}
Dokumentasi lengkap dapat dibaca di sini
Objectbox
ObjectBox adalah database relasional untuk menyimpan objek Dart. Berdasarkan benchmark yang dibuat oleh author package ini, ObjectBox lebih cepat dari Hive.
Fitur:
- Performan
- ACID
- Mendukung semua platform FLutter
- Relasi
- Query
- Tipe data statis (pengecekan dan optimisasi saat compile time)
- Migrasi skema
- Fitur berbayar sync dengan cloud ObjectBox
Contoh Penggunaan
@Entity()
class Person {
int id;
String firstName;
String lastName;
Person({this.id = 0, required this.firstName, required this.lastName});
}
final store = await openStore();
final box = store.box<Person>();
var person = Person(firstName: 'Joe', lastName: 'Green');
final id = box.put(person); // Create
person = box.get(id)!; // Read
person.lastName = "Black";
box.put(person); // Update
box.remove(person.id); // Delete
// find all people whose name start with letter 'J'
final query = box.query(Person_.firstName.startsWith('J')).build();
final people = query.find(); // find() returns List<Person>
Dokumentasi lengkap dapat dilihat di sini
Drift
Sebelumnya bernama Moor, Drift adalah database relasional seperti sqflite yang membedakan adalah type safety dan reactivitynya.
Fitur:
- Menulis Query dengan Dart maupun Raw SQL
- Auto update dengan stream
- Mendukung semua platform Flutter
- Performan karena menggunakan backend ffi
- Sedikit boilerplate karena menggunakan code generation build-runner
Contoh Penggunaan
Definis tabel
import 'package:drift/drift.dart';
part 'filename.g.dart';
class Todos extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text().withLength(min: 6, max: 32)();
TextColumn get content => text().named('body')();
IntColumn get category => integer().nullable()();
}
@DataClassName('Category')
class Categories extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get description => text()();
}
@DriftDatabase(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
}
Membuat query
@DriftDatabase(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
Future<List<Todo>> get allTodoEntries => select(todos).get();
Stream<List<Todo>> watchEntriesInCategory(Category c) {
return (select(todos)..where((t) => t.category.equals(c.id))).watch();
}
}
Dokumentasi lengkap drift