Floor — bu nima, Flutterda SQLite ustida ORM

Muallif: IT Sectr Nashr etilgan: 2026-03-13 O'qish vaqti: 9 daq

Floor — Flutter uchun SQLite ustida tiplangan qatlamni ta'minlovchi ORM (Object-Relational Mapping). Xom SQLite so'rovlaridan farqli o'laroq, Floor annotatsiya qilingan Dart modellaridan DAO sinflarini yaratadi. Pub.dev, 2024 ma'lumotlariga ko'ra, Floor 3500 dan ortiq Flutter loyihalarida qo'llaniladi va drift va hive bilan birga mahalliy ma'lumotlarni saqlash uchun eng mashhur ORM yechimlaridan biri hisoblanadi.

Asosiy fikrlar

  • Floor — annotatsiyalar orqali DAO va Entity kod generatsiyasi bilan SQLite ustida ORM
  • Tip xavfsizligi — so'rovlar kompilatsiya bosqichida tekshiriladi, SQL runtime xatolarini bartaraf etadi
  • DAO namunasi — Data Access Object SQL so'rovlarini Dart metodlarida inkapsulatsiya qiladi
  • Migratsiyalar — SQLite sxemasini versiyalash uchun o'rnatilgan qo'llab-quvvatlash
  • Reaktivlik — UI ni avtomatik yangilash uchun Stream orqali Flow so'rovlari

Floor nima?

Floor — SQLite asosida qurilgan Flutter va Dart uchun ORM kutubxonasi. U borliqlarni (Entity), Data Access Object (DAO) va ma'lumotlar bazasini (Database) tasvirlash uchun annotatsiyalardan foydalanadi. Kod generatsiyasi build_runner va floor_generator orqali amalga oshiriladi — kompilyator DAO implementatsiyalari va ma'lumotlar bazasini boshqarish sinfini yaratadi. Xom sqflite dan farqli o'laroq, Floor ResultSet ni Dart obyektlariga qo'lda aylantirish zaruratini butunlay bartaraf etadi, ustunlarni avtomatik ravishda Entity maydonlariga tip aks ettirish orqali moslashtiradi.

Floor Android dasturchilariga Room dan tanish bo'lgan Repository + DAO namunasiga amal qiladi. Har bir jadval @Entity annotatsiyasi bilan Dart sinfi orqali ifodalanadi, SQL so'rovlari @dao annotatsiyasi bilan interfeyslarda guruhlanadi va ma'lumotlar bazasi @Database bilan abstrakt sinfda yig'iladi. Bunday yondashuv ma'lumotlar modelini va so'rov mantiqini qat'iy ajratadi.

Flutter Pulse (2023) ma'lumotlariga ko'ra, Floor mahalliy ma'lumotlar bazasini talab qiladigan Flutter loyihalarining 28 foizida tanlanadi. Asosiy tanlov sabablari — SQL bilimi (yangi so'rov tilini o'rganish shart emas) va so'rovlarni kompilatsiya bosqichida tekshirishdir. Bundan tashqari, Floor o'qilishi mumkin bo'lgan kod yaratadi, bu esa maxsus DSL bilan mavhum ORM lardan farqli o'laroq, osonlikcha disk raskadrovka qilinadi va jamoadagi yangi dasturchilar uchun kirish chegarasini pasaytiradi.

Floor arxitekturasi

Floor uch qatlamdan iborat: Entity (jadval modeli), DAO (so'rov interfeysi) va Database (kirish nuqtasi). Generator maydonlarni moslashtirish uchun _$_Entity va SQL bajarish uchun _$_Dao implementatsiyalarini yaratadi. Entity yoki DAO o'zgartirilganda, build_runner ni qayta ishga tushirish kifoya — kod avtomatik yangilanadi. Sxema versiyalari o'rtasida migratsiya uchun Floor ketma-ket versiya raqamlaridan foydalanadi, bu foydalanuvchi qurilmalarida ilova yangilanishi vaqtida ma'lumotlar yaxlitligini kafolatlaydi.

Floor Flutterda qanday ishlaydi?

Floor platforma yig'ilishlari uchun sqflite paketi va desktop va web uchun sqlite3 orqali SQLite dan foydalanadi. Ilova ishga tushirilganda, Floor SQLite faylini yaratadi yoki ochadi, migratsiyalarni qo'llaydi va so'rovlarni bajarish uchun DAO metodlarini tayyorlaydi. Barcha operatsiyalar Future va Stream orqali asinxron rejimda amalga oshiriladi.

Floor da kod generatsiyasi quyidagi printsip bo'yicha ishlaydi: parser manba kodlaridan annotatsiyalarni o'qiydi, modellar va so'rovlarning AST (Abstract Syntax Tree) daraxtini yaratadi, so'ngra _$ prefiksi bilan Dart fayllarini yaratadi. Yaratilgan kod ResultSet → Entity va aksincha mapperlarni o'z ichiga oladi.

Ip xavfsizligi

Floor bitta izolyatda SQLite bilan ishlaydi. Barcha so'rovlar asinxron bajariladi, ammo parallel yozishlar SQLite darajasida bloklanadi. Tranzaksiyalar uchun @transaction annotatsiyasi ishlatiladi, bu so'rovlar guruhining atomarligini va xato bo'lganda qaytarilishini kafolatlaydi.

Floor vs Drift: Flutter uchun ORM taqqoslashi

Ham Floor, ham Drift — SQLite ustidagi ORM lar, ammo ular falsafasi bilan farqlanadi. Floor Android dagi Room ga yaqinroq, Drift esa o'rnatilgan Stream API va SQL fayllari orqali so'rov kompilatsiyasi bilan reaktivroq. Ular o'rtasidagi tanlov jamoaning tajribasiga va talab qilinadigan reaktivlikka bog'liq.

XususiyatFloorDrift
So'rov turi@Query da SQL satrlariDart metodlari + sql fayllari
Kod generatsiyasifloor_generator (build_runner)drift_dev (build_runner)
ReaktivlikDAO dan StreamO'rnatilgan Stream API + avtomatik yangilash
MurakkablikPast (tanish SQL)O'rta (o'z DSL)
MigratsiyalarQo'lda SQL skriptlariAvtomatik + qo'lda
MoslikAndroid, iOS, macOSAndroid, iOS, Web, macOS, Linux

Floor ni qachon tanlash kerak

Floor — SQL va Android Room ni allaqachon biladigan jamoalarning tanlovi. Agar dasturchilar SQL so'rovlarini qo'lda yozishga o'rganib qolgan bo'lsa va SQLite ustida minimal qoplama istasa — Floor yangi DSL o'rganmasdan tipizatsiyani ta'minlaydi. Shuningdek, uni disk raskadrovka qilish osonroq, chunki yaratilgan kod o'qiladigan va bashorat qilinadigan.

Drift qachon yaxshiroq

Drift kuchliroq reaktivlik beradi va ko'proq platformalarni qo'llab-quvvatlaydi. Agar ilova UI yangilash uchun Stream dan faol foydalansa, JOIN va quyi so'rovlar bilan murakkab so'rovlarni talab qilsa yoki web uchun yig'ilayotgan bo'lsa — Drift afzal. Biroq, uning kirish chegarasi o'z DSL ni o'rganish zarurati tufayli yuqoriroq.

Floor bilan kod misollari

Floor annotatsiyalar atrofida qurilgan. Quyida vazifalar ro'yxati ilovasi uchun Entity, DAO va Database ning to'liq namunasi keltirilgan. build_runner ishga tushirilgandan so'ng, yaratilgan sinflar foydalanishga tayyor.

Entity va DAO ta'rifi

TaskEntity sinfi @Entity annotatsiyasi bilan task jadvaliga moslashtiriladi. @primaryKey bilan maydon asosiy kalitga aylanadi. TaskDao interfeysi jadval operatsiyalari uchun metodlarni o'z ichiga oladi — har bir metod @Query, @Insert, @Update yoki @Delete bilan annotatsiya qilinadi.

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

Ma'lumotlar bazasini ishga tushirish

@Database annotatsiyasi bilan abstrakt sinf Entity va DAO ni bog'laydi. databaseBuilder metodi ma'lumotlar bazasi nusxasini yaratadi. Build chaqirilgandan so'ng, baza tayyor: Floor SQLite faylini ochadi, migratsiyalarni qo'llaydi va ish uchun DAO qaytaradi.

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

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

Stream orqali reaktiv so'rovlar

Floor DAO metodlaridan Stream qaytarilishini qo'llab-quvvatlaydi. Jadvaldagi har qanday o'zgarishlarda Stream yangi ro'yxatni chiqaradi. Bu Flutterdagi StreamBuilder bilan integratsiyalanadi — yozuvlar qo'shilganda, o'zgartirilganda yoki o'chirilganda UI avtomatik yangilanadi.

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

// Flutter vidjetida
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 da migratsiyalar va versiyalash

Floor @Database annotatsiyasidagi version parametri orqali ma'lumotlar bazasini versiyalashni qo'llab-quvvatlaydi. Entity o'zgartirilganda (maydonlar qo'shilganda yoki o'chirilganda) versiyani oshirish va migratsiya qo'shish kerak. Migratsiya — tranzaksiyani qabul qiladigan va ALTER TABLE SQL so'rovlarini bajaradigan Dart funksiyasi.

Migratsiya namunasi

Faraz qilaylik, 2-versiyada TaskEntity ga dueDate maydonini qo'shdik. Migratsiya ALTER TABLE SQL so'rovi bilan amalga oshiriladi. Agar migratsiya ko'rsatilmagan bo'lsa, Floor MigrationStrategy ni chaqiradi, unda fallback o'rnatilishi mumkin (masalan, ma'lumotlarni yo'qotish bilan jadvalni qayta yaratish).

Floor so'rovlarini test qilish

Floor o'rnatilgan mock freymvorkni ta'minlamaydi, ammo ma'lumotlar bazasini testlarda osongina almashtirish mumkin. inMemoryDatabaseBuilder yarating — u sxema bo'yicha ishlab chiqarish bazasi bilan bir xil bo'lgan xotirada SQLite bazasini yaratadi. Har bir testdan so'ng, test stsenariylarini izolyatsiya qilish uchun ma'lumotlarni deleteDatabase orqali tozalang.

Floor da tranzaksiyalar va paketli operatsiyalar

Floor DAO metodida @transaction annotatsiyasi orqali tranzaksiyalarni qo'llab-quvvatlaydi. Tranzaksiya ichida bir nechta so'rovlar xato bo'lganda qaytarilish kafolati bilan ketma-ket bajariladi. @Insert bilan List<T> parametri orqali paketli kiritish bir chaqiruvda ko'plab yozuvlarni kiritishni optimallashtiradi — bu sikl ichida birma-bir kiritishdan bir necha barobar tezroq. Ommaviy operatsiyalar uchun 100–200 yozuvdan paketli kiritishdan foydalaning: bu cheklangan resurslarga ega mobil qurilmalarda bajarish tezligi va RAM iste'moli o'rtasidagi optimal muvozanatdir.

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

Tez-tez beriladigan savollar

Floor xom sqflite dan nima bilan farq qiladi?

sqflite SQL so'rovlarini qo'lda yozishni va ResultSet ni obyektlarga moslashtirishni talab qiladi. Floor bu kodni avtomatik yaratadi: siz Entity va DAO ni tasvirlaysiz, tiplangan metodlar esa tayyor Dart obyektlarini qaytaradi. Floor shuningdek annotatsiyalar orqali SQL so'rovlarini kompilatsiya bosqichida tekshiradi.

Floor jadvallar o'rtasidagi aloqalarni qo'llab-quvvatlaydimi?

Floor da Room kabi aloqalar uchun o'rnatilgan annotatsiyalar (ForeignKey, @Relation) mavjud emas. Aloqalar @Query da qo'lda SQL JOIN so'rovlari orqali amalga oshiriladi. Murakkab relyatsion sxemalar uchun aloqalar uchun o'rnatilgan qo'llab-quvvatlashga ega Drift ni ko'rib chiqish yaxshiroq.

Floor SQL so'rovlarini qanday disk raskadrovka qilish mumkin?

Floor DatabaseBuilder yaratilganda callback ni faollashtirishga imkon beradi — unga logger ulanishi mumkin bo'lgan sqflite.Database nusxasi uzatiladi. Shu bilan bir qatorda, dev rejimida sxema va ma'lumotlarni vizuallashtirish uchun floor_doctor dan foydalaning.

Floor web yig'ish uchun ishlatilishi mumkinmi?

Floor web muhitida ishlamaydigan sqflite dan foydalanadi. Web uchun WASM orqali sqlite3 bilan alohida yig'ish talab qilinadi. Joriy versiyada Floor rasman Android, iOS va macOS ni qo'llab-quvvatlaydi. Web uchun sqlite3 adapteri bilan Drift dan foydalaning.

Floor da so'rovlarni keshlash qanday ishlaydi?

Floor ning o'rnatilgan keshlashi yo'q — har bir so'rov SQLite ga bajariladi. Takrorlanuvchi so'rovlarni keshlash uchun xotiradagi kesh bilan Repository qatlamidan foydalaning (masalan, dart_cache). Floor faqat SQLite bilan ishlash uchun kod yaratadi, uning ustiga qo'shimchalar qo'shmaydi.

Xulosa

  • Floor — annotatsiyalar orqali Entity, DAO va Database kod generatsiyasi bilan SQLite ustida ORM
  • Tip xavfsizligi — SQL so'rovlari @Query annotatsiyasi orqali kompilatsiya bosqichida tekshiriladi
  • DAO namunasi — SQL so'rovlari Dart metodlarida inkapsulatsiya qilingan, model va mantiqni ajratadi
  • Migratsiyalar — qo'lda ALTER TABLE bilan Migration orqali sxemani versiyalash
  • Reaktivlik — o'zgarishlarda UI ni avtomatik yangilash uchun DAO dan Stream
  • Cheklovlar — o'rnatilgan aloqalar yo'q, web yig'ishni qo'llab-quvvatlamaydi
  • Tavsiya — jamoa SQL va Room yondashuvini biladigan Flutter loyihalari uchun Floor ni tanlang

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing