Floor — τι είναι, ORM πάνω από SQLite στο Flutter

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-13 Χρόνος ανάγνωσης: 9 λεπ

Floor — ORM (Object-Relational Mapping) για Flutter που παρέχει τυποποιημένο επίπεδο πάνω από SQLite. Σε αντίθεση με τα ακατέργαστα ερωτήματα SQLite, το Floor δημιουργεί κλάσεις DAO από σχολιασμένα μοντέλα Dart. Σύμφωνα με στοιχεία του Pub.dev, 2024, το Floor χρησιμοποιείται σε περισσότερα από 3500 έργα Flutter και βρίσκεται στις τρεις πιο δημοφιλείς λύσεις ORM για τοπική αποθήκευση δεδομένων μαζί με drift και hive.

Βασικά σημεία

  • Floor — ORM πάνω από SQLite με δημιουργία κώδικα DAO και Entity μέσω σχολιασμών
  • Ασφάλεια τύπων — τα ερωτήματα ελέγχονται κατά τη μεταγλώττιση, εξαλείφοντας σφάλματα χρόνου εκτέλεσης SQL
  • Μοτίβο DAO — Data Access Object ενσωματώνει ερωτήματα SQL σε μεθόδους Dart
  • Μεταναστεύσεις — ενσωματωμένη υποστήριξη για έλεγχο εκδόσεων σχήματος SQLite
  • Αντιδραστικότητα — ερωτήματα Flow μέσω Stream για αυτόματη ενημέρωση UI

Τι είναι το Floor;

Floor — είναι μια βιβλιοθήκη ORM για Flutter και Dart, χτισμένη πάνω στην SQLite. Χρησιμοποιεί σχολιασμούς για να περιγράψει οντότητες (Entity), Data Access Object (DAO) και βάση δεδομένων (Database). Η δημιουργία κώδικα γίνεται μέσω build_runner και floor_generator — ο μεταγλωττιστής δημιουργεί υλοποιήσεις DAO και την κλάση διαχείρισης βάσης δεδομένων. Σε αντίθεση με το ακατέργαστο sqflite, το Floor εξαλείφει πλήρως την ανάγκη χειροκίνητης μετατροπής ResultSet σε αντικείμενα Dart, αντιστοιχίζοντας αυτόματα στήλες σε πεδία Entity μέσω αντανάκλασης τύπων.

Το Floor ακολουθεί το μοτίβο Repository + DAO, γνωστό στους προγραμματιστές Android από το Room. Κάθε πίνακας αντιπροσωπεύεται από μια κλάση Dart με σχολιασμό @Entity, τα ερωτήματα SQL ομαδοποιούνται σε διεπαφές με σχολιασμό @dao και η βάση δεδομένων συναρμολογείται σε μια αφηρημένη κλάση με @Database. Αυτή η προσέγγιση διαχωρίζει αυστηρά το μοντέλο δεδομένων και τη λογική ερωτημάτων.

Σύμφωνα με το Flutter Pulse (2023), το Floor επιλέγεται στο 28% των έργων Flutter που απαιτούν τοπική βάση δεδομένων. Οι κύριοι λόγοι επιλογής — γνώση SQL (δεν χρειάζεται εκμάθηση νέας γλώσσας ερωτημάτων) και έλεγχος ερωτημάτων κατά τη μεταγλώττιση. Επιπλέον, το Floor δημιουργεί ευανάγνωστο κώδικα που είναι εύκολο να διορθωθεί σε αντίθεση με πιο αφηρημένα ORM με προσαρμοσμένο DSL, μειώνοντας το κατώφλι εισόδου για νέους προγραμματιστές στην ομάδα.

Αρχιτεκτονική του Floor

Floor αποτελείται από τρία επίπεδα: Entity (μοντέλο πίνακα), DAO (διεπαφή ερωτημάτων) και Database (σημείο εισόδου). Η γεννήτρια δημιουργεί υλοποιήσεις _$_Entity για αντιστοίχιση πεδίων και _$_Dao για εκτέλεση SQL. Κατά την αλλαγή Entity ή DAO, αρκεί η επανεκκίνηση του build_runner — ο κώδικας θα ενημερωθεί αυτόματα. Για μετανάστευση μεταξύ εκδόσεων σχήματος, το Floor χρησιμοποιεί διαδοχικούς αριθμούς έκδοσης, εγγυώμενο την ακεραιότητα δεδομένων κατά την ενημέρωση εφαρμογής σε συσκευές χρηστών.

Πώς λειτουργεί το Floor στο Flutter;

Floor χρησιμοποιεί SQLite μέσω του πακέτου sqflite για μεταγλωττίσεις πλατφόρμας και sqlite3 για επιτραπέζιους υπολογιστές και web. Κατά την εκκίνηση της εφαρμογής, το Floor δημιουργεί ή ανοίγει το αρχείο SQLite, εφαρμόζει μεταναστεύσεις και προετοιμάζει μεθόδους DAO για εκτέλεση ερωτημάτων. Όλες οι λειτουργίες εκτελούνται σε ασύγχρονη λειτουργία μέσω Future και Stream.

Η δημιουργία κώδικα στο Floor λειτουργεί με την εξής αρχή: ο αναλυτής διαβάζει σχολιασμούς από τον πηγαίο κώδικα, δημιουργεί AST (Abstract Syntax Tree) μοντέλων και ερωτημάτων, στη συνέχεια δημιουργεί αρχεία Dart με πρόθεμα _$. Ο παραγόμενος κώδικας περιλαμβάνει αντιστοιχίσεις ResultSet → Entity και αντίστροφα.

Ασφάλεια νημάτων

Floor λειτουργεί με SQLite σε ένα απομονωμένο περιβάλλον. Όλα τα ερωτήματα εκτελούνται ασύγχρονα, αλλά οι ταυτόχρονες εγγραφές μπλοκάρονται σε επίπεδο SQLite. Για συναλλαγές χρησιμοποιείται ο σχολιασμός @transaction, που εγγυάται την ατομικότητα της ομάδας ερωτημάτων και αναίρεση σε περίπτωση σφάλματος.

Floor vs Drift: σύγκριση ORM για Flutter

Τόσο το Floor όσο και το Drift — είναι ORM πάνω από SQLite, αλλά διαφέρουν στη φιλοσοφία. Το Floor είναι πιο κοντά στο Room από το Android, το Drift — πιο αντιδραστικό με ενσωματωμένο Stream API και μεταγλώττιση ερωτημάτων μέσω αρχείων SQL. Η επιλογή μεταξύ τους εξαρτάται από την εμπειρία της ομάδας και την απαιτούμενη αντιδραστικότητα.

ΧαρακτηριστικόFloorDrift
Τύπος ερωτημάτωνΣυμβολοσειρές SQL σε @QueryΜέθοδοι Dart + αρχεία sql
Δημιουργία κώδικαfloor_generator (build_runner)drift_dev (build_runner)
ΑντιδραστικότηταStream από DAOΕνσωματωμένο Stream API + αυτόματη ενημέρωση
ΠολυπλοκότηταΧαμηλή (γνωστή SQL)Μεσαία (δικό της DSL)
ΜεταναστεύσειςΧειροκίνητα σενάρια SQLΑυτόματες + χειροκίνητες
ΣυμβατότηταAndroid, iOS, macOSAndroid, iOS, Web, macOS, Linux

Πότε να επιλέξετε Floor

Floor — η επιλογή ομάδων που ήδη γνωρίζουν SQL και Android Room. Εάν οι προγραμματιστές είναι συνηθισμένοι να γράφουν ερωτήματα SQL χειροκίνητα και θέλουν ένα ελάχιστο περιτύλιγμα πάνω από SQLite — το Floor παρέχει τυποποίηση χωρίς εκμάθηση νέου DSL. Είναι επίσης πιο εύκολο στον εντοπισμό σφαλμάτων, καθώς ο παραγόμενος κώδικας είναι ευανάγνωστος και προβλέψιμος.

Πότε είναι καλύτερο το Drift

Drift παρέχει ισχυρότερη αντιδραστικότητα και υποστηρίζει περισσότερες πλατφόρμες. Εάν η εφαρμογή χρησιμοποιεί ενεργά το Stream για ενημέρωση UI, απαιτεί σύνθετα ερωτήματα με JOIN και υποερωτήματα ή κατασκευάζεται για web — το Drift είναι προτιμότερο. Ωστόσο, το κατώφλι εισόδου του είναι υψηλότερο λόγω της ανάγκης εκμάθησης του δικού του DSL.

Παραδείγματα κώδικα με Floor

Floor είναι χτισμένο γύρω από σχολιασμούς. Παρακάτω είναι ένα πλήρες παράδειγμα Entity, DAO και Database για μια εφαρμογή λίστας εργασιών. Μετά την εκτέλεση του build_runner, οι παραγόμενες κλάσεις είναι έτοιμες για χρήση.

Ορισμός Entity και DAO

Η κλάση TaskEntity με σχολιασμό @Entity αντιστοιχίζεται στον πίνακα task. Το πεδίο με @primaryKey γίνεται πρωτεύον κλειδί. Η διεπαφή TaskDao περιέχει μεθόδους για λειτουργίες στον πίνακα — κάθε μέθοδος έχει σχολιασμό @Query, @Insert, @Update ή @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);
}

Αρχικοποίηση βάσης δεδομένων

Η αφηρημένη κλάση με σχολιασμό @Database συνδέει Entity και DAO. Η μέθοδος databaseBuilder δημιουργεί ένα στιγμιότυπο βάσης δεδομένων. Μετά την κλήση build, η βάση είναι έτοιμη: το Floor ανοίγει το αρχείο SQLite, εφαρμόζει μεταναστεύσεις και επιστρέφει DAO για εργασία.

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

// Χρήση
final database = await $FloorAppDatabase.databaseBuilder('app.db').build();
final taskDao = database.taskDao;
final tasks = await taskDao.getAllTasks();

Αντιδραστικά ερωτήματα μέσω Stream

Floor υποστηρίζει την επιστροφή Stream από μεθόδους DAO. Με οποιεσδήποτε αλλαγές στον πίνακα, το Stream εκπέμπει μια νέα λίστα. Αυτό ενσωματώνεται με το StreamBuilder στο Flutter — το UI ενημερώνεται αυτόματα κατά την προσθήκη, τροποποίηση ή διαγραφή εγγραφών.

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

// Στο 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]),
        );
    },
)

Μεταναστεύσεις και έλεγχος εκδόσεων στο Floor

Floor υποστηρίζει έλεγχο εκδόσεων βάσης δεδομένων μέσω της παραμέτρου version στον σχολιασμό @Database. Κατά την αλλαγή Entity (προσθήκη ή αφαίρεση πεδίων) πρέπει να αυξήσετε την έκδοση και να προσθέσετε μια μετανάστευση. Η μετανάστευση είναι μια συνάρτηση Dart που λαμβάνει μια συναλλαγή και εκτελεί ερωτήματα SQL ALTER TABLE.

Παράδειγμα μετανάστευσης

Ας υποθέσουμε ότι στην έκδοση 2 προσθέσαμε το πεδίο dueDate στο TaskEntity. Η μετανάστευση εκτελείται με ερώτημα SQL ALTER TABLE. Εάν δεν έχει καθοριστεί μετανάστευση, το Floor καλεί το MigrationStrategy, όπου μπορεί να οριστεί fallback (π.χ. αναδημιουργία πίνακα με απώλεια δεδομένων).

Δοκιμή ερωτημάτων Floor

Floor δεν παρέχει ενσωματωμένο πλαίσιο προσομοίωσης, αλλά η βάση δεδομένων μπορεί εύκολα να αντικατασταθεί σε δοκιμές. Δημιουργήστε inMemoryDatabaseBuilder — δημιουργεί μια βάση SQLite στη μνήμη, πανομοιότυπη σε σχήμα με την παραγωγή. Μετά από κάθε δοκιμή, καθαρίστε τα δεδομένα μέσω deleteDatabase για απομόνωση σεναρίων δοκιμής.

Συναλλαγές και μαζικές λειτουργίες στο Floor

Floor υποστηρίζει συναλλαγές μέσω σχολιασμού @transaction σε μέθοδο DAO. Εντός της συναλλαγής, πολλαπλά ερωτήματα εκτελούνται διαδοχικά με εγγύηση αναίρεσης σε περίπτωση σφάλματος. Η μαζική εισαγωγή μέσω @Insert με παράμετρο List<T> βελτιστοποιεί την εισαγωγή πολλαπλών εγγραφών σε μία κλήση — αυτό είναι αρκετές φορές ταχύτερο από την μεμονωμένη εισαγωγή σε βρόχο. Για μαζικές λειτουργίες, χρησιμοποιήστε μαζική εισαγωγή 100–200 εγγραφών: αυτή είναι η βέλτιστη ισορροπία μεταξύ ταχύτητας εκτέλεσης και κατανάλωσης RAM σε φορητές συσκευές με περιορισμένους πόρους.

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();

Συχνές Ερωτήσεις

Σε τι διαφέρει το Floor από το ακατέργαστο sqflite;

sqflite απαιτεί χειροκίνητη σύνταξη ερωτημάτων SQL και αντιστοίχιση ResultSet σε αντικείμενα. Το Floor δημιουργεί αυτόν τον κώδικα αυτόματα: περιγράφετε Entity και DAO, και οι τυποποιημένες μέθοδοι επιστρέφουν έτοιμα αντικείμενα Dart. Το Floor επίσης ελέγχει ερωτήματα SQL κατά τη μεταγλώττιση μέσω σχολιασμών.

Υποστηρίζει το Floor σχέσεις μεταξύ πινάκων;

Floor δεν έχει ενσωματωμένους σχολιασμούς για σχέσεις (ForeignKey, @Relation), όπως το Room. Οι σχέσεις υλοποιούνται μέσω χειροκίνητων ερωτημάτων SQL JOIN στο @Query. Για πολύπλοκα σχεσιακά σχήματα, είναι καλύτερο να εξετάσετε το Drift με την ενσωματωμένη υποστήριξη σχέσεων.

Πώς γίνεται εντοπισμός σφαλμάτων ερωτημάτων SQL Floor;

Floor επιτρέπει την ενεργοποίηση callback callback κατά τη δημιουργία DatabaseBuilder — σε αυτό μεταβιβάζεται ένα στιγμιότυπο sqflite.Database στο οποίο μπορεί να προσαρτηθεί ένας καταγραφέας. Εναλλακτικά, χρησιμοποιήστε το floor_doctor για οπτικοποίηση σχήματος και δεδομένων σε λειτουργία ανάπτυξης.

Μπορεί να χρησιμοποιηθεί το Floor για μεταγλώττιση web;

Floor χρησιμοποιεί sqflite, το οποίο δεν λειτουργεί σε περιβάλλον web. Για web απαιτείται ξεχωριστή μεταγλώττιση με sqlite3 μέσω WASM. Στην τρέχουσα έκδοση, το Floor υποστηρίζει επίσημα Android, iOS και macOS. Για web, χρησιμοποιήστε Drift με προσαρμογέα sqlite3.

Πώς λειτουργεί η προσωρινή αποθήκευση ερωτημάτων στο Floor;

Floor δεν έχει ενσωματωμένη προσωρινή αποθήκευση — κάθε ερώτημα εκτελείται στην SQLite. Για προσωρινή αποθήκευση επαναλαμβανόμενων ερωτημάτων, χρησιμοποιήστε επίπεδο Repository με προσωρινή μνήμη στη μνήμη (π.χ. dart_cache). Το Floor απλώς δημιουργεί κώδικα για εργασία με SQLite, χωρίς να προσθέτει επιπλέον επίπεδα.

Σύνοψη

  • Floor — ORM πάνω από SQLite με δημιουργία κώδικα Entity, DAO και Database μέσω σχολιασμών
  • Ασφάλεια τύπων — ερωτήματα SQL ελέγχονται κατά τη μεταγλώττιση μέσω σχολιασμού @Query
  • Μοτίβο DAO — ερωτήματα SQL ενσωματωμένα σε μεθόδους Dart, διαχωρίζοντας μοντέλο και λογική
  • Μεταναστεύσεις — έλεγχος εκδόσεων σχήματος μέσω Migration με χειροκίνητο ALTER TABLE
  • Αντιδραστικότητα — Stream από DAO για αυτόματη ενημέρωση UI σε αλλαγές
  • Περιορισμοί — δεν υπάρχουν ενσωματωμένες σχέσεις, δεν υποστηρίζει web
  • Σύσταση — επιλέξτε Floor για έργα Flutter όπου η ομάδα γνωρίζει SQL και την προσέγγιση Room

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης