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 — 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 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 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.
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.
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.
| Xususiyat | Floor | Drift |
|---|---|---|
| So'rov turi | @Query da SQL satrlari | Dart metodlari + sql fayllari |
| Kod generatsiyasi | floor_generator (build_runner) | drift_dev (build_runner) |
| Reaktivlik | DAO dan Stream | O'rnatilgan Stream API + avtomatik yangilash |
| Murakkablik | Past (tanish SQL) | O'rta (o'z DSL) |
| Migratsiyalar | Qo'lda SQL skriptlari | Avtomatik + qo'lda |
| Moslik | Android, iOS, macOS | Android, iOS, Web, macOS, Linux |
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 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 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.
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.
@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 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.
@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();
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.
@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 @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.
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 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 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.
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
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 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 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 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 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
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.