Floor — apa itu, ORM di atas SQLite di Flutter

Penulis: IT Sectr Diterbitkan: 2026-03-13 Waktu membaca: 9 mnt

Floor — ORM (Object-Relational Mapping) untuk Flutter yang menyediakan lapisan bertipe di atas SQLite. Tidak seperti query SQLite mentah, Floor menghasilkan kelas DAO dari model Dart yang dianotasi. Menurut data Pub.dev, 2024, Floor digunakan di lebih dari 3500 proyek Flutter dan masuk dalam tiga besar solusi ORM paling populer untuk penyimpanan data lokal bersama drift dan hive.

Poin Utama

  • Floor — ORM di atas SQLite dengan pembuatan kode DAO dan Entity melalui anotasi
  • Keamanan tipe — query diperiksa saat kompilasi, menghilangkan kesalahan runtime SQL
  • Pola DAO — Data Access Object mengenkapsulasi query SQL dalam metode Dart
  • Migrasi — dukungan bawaan untuk versioning skema SQLite
  • Reaktivitas — query Flow melalui Stream untuk pembaruan UI otomatis

Apa itu Floor?

Floor — adalah pustaka ORM untuk Flutter dan Dart yang dibangun di atas SQLite. Ia menggunakan anotasi untuk mendeskripsikan entitas (Entity), Data Access Object (DAO), dan database (Database). Pembuatan kode dilakukan melalui build_runner dan floor_generator — kompiler membuat implementasi DAO dan kelas pengelola database. Tidak seperti sqflite mentah, Floor sepenuhnya menghilangkan kebutuhan konversi manual ResultSet ke objek Dart, secara otomatis memetakan kolom ke bidang Entity melalui refleksi tipe.

Floor mengikuti pola Repository + DAO yang dikenal oleh pengembang Android dari Room. Setiap tabel diwakili oleh kelas Dart dengan anotasi @Entity, query SQL dikelompokkan dalam antarmuka dengan anotasi @dao, dan database disusun dalam kelas abstrak dengan @Database. Pendekatan ini secara ketat memisahkan model data dan logika query.

Menurut Flutter Pulse (2023), Floor dipilih dalam 28% proyek Flutter yang membutuhkan database lokal. Alasan utama pemilihan — pengetahuan SQL (tidak perlu belajar bahasa query baru) dan pemeriksaan query saat kompilasi. Selain itu, Floor menghasilkan kode yang dapat dibaca dan mudah di-debug tidak seperti ORM yang lebih abstrak dengan DSL kustom, yang menurunkan ambang masuk bagi pengembang baru di tim.

Arsitektur Floor

Floor terdiri dari tiga lapisan: Entity (model tabel), DAO (antarmuka query), dan Database (titik masuk). Generator membuat implementasi _$_Entity untuk pemetaan bidang dan _$_Dao untuk eksekusi SQL. Saat Entity atau DAO diubah, cukup restart build_runner — kode akan diperbarui secara otomatis. Untuk migrasi antar versi skema, Floor menggunakan nomor versi berurutan yang menjamin integritas data saat memperbarui aplikasi di perangkat pengguna.

Bagaimana cara kerja Floor di Flutter?

Floor menggunakan SQLite melalui paket sqflite untuk build platform dan sqlite3 untuk desktop dan web. Saat aplikasi dijalankan, Floor membuat atau membuka file SQLite, menerapkan migrasi, dan menyiapkan metode DAO untuk mengeksekusi query. Semua operasi dilakukan secara asinkron melalui Future dan Stream.

Pembuatan kode di Floor bekerja berdasarkan prinsip berikut: parser membaca anotasi dari kode sumber, membuat AST (Abstract Syntax Tree) model dan query, kemudian menghasilkan file Dart dengan awalan _$. Kode yang dihasilkan mencakup pemeta ResultSet → Entity dan sebaliknya.

Keamanan utas

Floor bekerja dengan SQLite dalam satu isolat. Semua query dijalankan secara asinkron, tetapi penulisan bersamaan diblokir di tingkat SQLite. Untuk transaksi, digunakan anotasi @transaction yang menjamin atomisitas grup query dan pengembalian saat terjadi kesalahan.

Floor vs Drift: perbandingan ORM untuk Flutter

Baik Floor maupun Drift — adalah ORM di atas SQLite, tetapi mereka berbeda dalam filosofi. Floor lebih dekat ke Room dari Android, Drift — lebih reaktif dengan Stream API bawaan dan kompilasi query melalui file SQL. Pilihan di antara keduanya tergantung pada pengalaman tim dan reaktivitas yang diperlukan.

KarakteristikFloorDrift
Tipe queryString SQL di @QueryMetode Dart + file sql
Pembuatan kodefloor_generator (build_runner)drift_dev (build_runner)
ReaktivitasStream dari DAOStream API bawaan + pembaruan otomatis
KompleksitasRendah (SQL dikenal)Sedang (DSL sendiri)
MigrasiSkrip SQL manualOtomatis + manual
KompatibilitasAndroid, iOS, macOSAndroid, iOS, Web, macOS, Linux

Kapan memilih Floor

Floor — pilihan tim yang sudah mengenal SQL dan Android Room. Jika pengembang terbiasa menulis query SQL secara manual dan menginginkan lapisan minimal di atas SQLite — Floor memberikan pengetikan tanpa mempelajari DSL baru. Ia juga lebih mudah di-debug karena kode yang dihasilkan dapat dibaca dan dapat diprediksi.

Kapan Drift lebih baik

Drift memberikan reaktivitas yang lebih kuat dan mendukung lebih banyak platform. Jika aplikasi secara aktif menggunakan Stream untuk pembaruan UI, membutuhkan query kompleks dengan JOIN dan subquery, atau dibangun untuk web — Drift lebih diutamakan. Namun, ambang masuknya lebih tinggi karena kebutuhan mempelajari DSL sendiri.

Contoh kode dengan Floor

Floor dibangun di sekitar anotasi. Di bawah ini adalah contoh lengkap Entity, DAO, dan Database untuk aplikasi daftar tugas. Setelah menjalankan build_runner, kelas yang dihasilkan siap digunakan.

Definisi Entity dan DAO

Kelas TaskEntity dengan anotasi @Entity dipetakan ke tabel task. Bidang dengan @primaryKey menjadi kunci utama. Antarmuka TaskDao berisi metode untuk operasi tabel — setiap metode dianotasi dengan @Query, @Insert, @Update, atau @Delete.

dart
@entity
class TaskEntity {
    @PrimaryKey(autoGenerate: true)
    final int id;
    final String title;
    final bool isCompleted;
    final int priority;

    TaskEntity({this.id, required this.title,
        this.isCompleted = false, this.priority = 0});
}

@dao
abstract class TaskDao {
    @Query('SELECT * FROM TaskEntity ORDER BY priority DESC')
    Future<List<TaskEntity>> getAllTasks();

    @Insert
    Future<int> insertTask(TaskEntity task);

    @Update
    Future<void> updateTask(TaskEntity task);

    @Query('SELECT * FROM TaskEntity WHERE isCompleted = :status')
    Stream<List<TaskEntity>> watchTasks(bool status);
}

Inisialisasi database

Kelas abstrak dengan anotasi @Database menghubungkan Entity dan DAO. Metode databaseBuilder membuat instance database. Setelah memanggil build, database siap: Floor membuka file SQLite, menerapkan migrasi, dan mengembalikan DAO untuk digunakan.

dart
@Database(version: 1, entities: [TaskEntity])
abstract class AppDatabase extends FloorDatabase {
    TaskDao get taskDao;
}

// Penggunaan
final database = await $FloorAppDatabase.databaseBuilder('app.db').build();
final taskDao = database.taskDao;
final tasks = await taskDao.getAllTasks();

Query reaktif melalui Stream

Floor mendukung pengembalian Stream dari metode DAO. Setiap perubahan dalam tabel, Stream mengeluarkan daftar baru. Ini terintegrasi dengan StreamBuilder di Flutter — UI diperbarui secara otomatis saat menambah, mengubah, atau menghapus catatan.

dart
@Query('SELECT * FROM TaskEntity ORDER BY priority DESC')
Stream<List<TaskEntity>> watchAllTasks();

// Di widget Flutter
StreamBuilder<List<TaskEntity>>(
    stream: taskDao.watchAllTasks(),
    builder: (context, snapshot) {
        final tasks = snapshot.data ?? [];
        return ListView.builder(
            itemCount: tasks.length,
            itemBuilder: (_, i) => TaskTile(tasks[i]),
        );
    },
)

Migrasi dan versioning di Floor

Floor mendukung versioning database melalui parameter version di anotasi @Database. Saat Entity diubah (menambah atau menghapus bidang), Anda perlu meningkatkan versi dan menambahkan migrasi. Migrasi adalah fungsi Dart yang menerima transaksi dan menjalankan query SQL ALTER TABLE.

Contoh migrasi

Misalkan di versi 2 kita menambahkan bidang dueDate ke TaskEntity. Migrasi dijalankan dengan query SQL ALTER TABLE. Jika migrasi tidak ditentukan, Floor memanggil MigrationStrategy, di mana fallback dapat diatur (misalnya, membuat ulang tabel dengan kehilangan data).

Pengujian query Floor

Floor tidak menyediakan framework mock bawaan, tetapi database dapat dengan mudah diganti dalam pengujian. Buat inMemoryDatabaseBuilder — ia membuat database SQLite di memori, identik dalam skema dengan produksi. Setelah setiap pengujian, bersihkan data melalui deleteDatabase untuk isolasi skenario pengujian.

Transaksi dan operasi batch di Floor

Floor mendukung transaksi melalui anotasi @transaction pada metode DAO. Di dalam transaksi, beberapa query dijalankan secara berurutan dengan jaminan pengembalian saat kesalahan. Penyisipan batch melalui @Insert dengan parameter List<T> mengoptimalkan penyisipan banyak catatan dalam satu panggilan — ini beberapa kali lebih cepat daripada penyisipan satu per satu dalam loop. Untuk operasi massal, gunakan penyisipan batch 100–200 catatan: ini adalah keseimbangan optimal antara kecepatan eksekusi dan konsumsi RAM pada perangkat seluler dengan sumber daya terbatas.

dart
final migration1to2 = Migration(1, 2, (database) async {
    await database.execute(
        'ALTER TABLE TaskEntity ADD COLUMN dueDate TEXT'
    );
});

final database = await $FloorAppDatabase.databaseBuilder('app.db')
    .addMigrations([migration1to2])
    .build();

Pertanyaan yang Sering Diajukan

Apa perbedaan Floor dengan sqflite mentah?

sqflite memerlukan penulisan manual query SQL dan pemetaan ResultSet ke objek. Floor menghasilkan kode ini secara otomatis: Anda mendeskripsikan Entity dan DAO, dan metode yang diketik mengembalikan objek Dart yang siap pakai. Floor juga memeriksa query SQL saat kompilasi melalui anotasi.

Apakah Floor mendukung hubungan antar tabel?

Floor tidak memiliki anotasi bawaan untuk hubungan (ForeignKey, @Relation) seperti Room. Hubungan diimplementasikan melalui query SQL JOIN manual di @Query. Untuk skema relasional yang kompleks, pertimbangkan Drift dengan dukungan bawaannya untuk hubungan.

Bagaimana cara men-debug query SQL Floor?

Floor memungkinkan mengaktifkan callback callback saat membuat DatabaseBuilder — instance sqflite.Database diteruskan ke dalamnya, di mana logger dapat dipasang. Alternatifnya, gunakan floor_doctor untuk visualisasi skema dan data dalam mode pengembangan.

Bisakah Floor digunakan untuk build web?

Floor menggunakan sqflite yang tidak berfungsi di lingkungan web. Untuk web diperlukan build terpisah dengan sqlite3 melalui WASM. Dalam versi saat ini, Floor secara resmi mendukung Android, iOS, dan macOS. Untuk web, gunakan Drift dengan adaptor sqlite3.

Bagaimana cara kerja caching query di Floor?

Floor tidak memiliki caching bawaan — setiap query dijalankan ke SQLite. Untuk caching query berulang, gunakan lapisan Repository dengan cache in-memory (misalnya, dart_cache). Floor hanya menghasilkan kode untuk bekerja dengan SQLite, tanpa menambahkan lapisan di atasnya.

Kesimpulan

  • Floor — ORM di atas SQLite dengan pembuatan kode Entity, DAO, dan Database melalui anotasi
  • Keamanan tipe — query SQL diperiksa saat kompilasi melalui anotasi @Query
  • Pola DAO — query SQL dienkapsulasi dalam metode Dart, memisahkan model dan logika
  • Migrasi — versioning skema melalui Migration dengan ALTER TABLE manual
  • Reaktivitas — Stream dari DAO untuk pembaruan UI otomatis saat perubahan
  • Keterbatasan — tidak ada hubungan bawaan, tidak mendukung build web
  • Rekomendasi — pilih Floor untuk proyek Flutter di mana tim mengenal SQL dan pendekatan Room

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga