
فریمورک قدرتمند و متن باز گوگل به نام فلاتر و توسعه داده شده با زبان دارت ، به توسعه دهندگان این امکان را میدهد که با یک بار نوشتن کد، اپلیکیشن های زیبایی برای پلتفرم های مختلف مانند اندروید، iOS، وب و دسکتاپ ایجاد کنند.
Drift یک ORM (Object-Relational Mapping) قدرتمند برای کار با پایگاه داده SQLite در اپلیکیشن های Flutter و Dart است. این کتابخانه به توسعه دهندگان اجازه میدهد تا با استفاده از کدهای Dart به سادگی کوئری های SQL را نوشته و مدیریت کنند، بدون نیاز به نوشتن مستقیم SQL. Drift امکاناتی همچون کوئری های قابل ترکیب، واکنش گرایی (Reactive) در دیتابیس، و تولید خودکار کدهای مرتبط با جداول را فراهم میکند. به طور خلاصه، Drift ارتباط بین اپلیکیشن و پایگاه داده را بسیار ساده و منعطف میسازد و امکان مدیریت دادهها در یک ساختار منظم و بهینه را فراهم میکند.
یکی از مزایای کلیدی Drift، سازگاری با پلتفرم های مختلف است؛ از ویندوز و اندروید گرفته تا وب، این کتابخانه به توسعه دهندگان کمک میکند تا بدون نگرانی از جزئیات پیچیده هر پلتفرم، به راحتی دیتابیس خود را مدیریت کنند.
برای شروع استفاده از Drift در پروژه Flutter، ابتدا باید این کتابخانه را نصب و پیکربندی کنید. Drift به راحتی با SQLite ادغام میشود و امکاناتی مانند کوئری نویسی ساده، مدیریت جداول و تعامل واکنشگرا با دیتابیس را فراهم می آورد. در این بخش، مراحل نصب و تنظیمات اولیه Drift را بررسی میکنیم.
ابتدا باید کتابخانه های Drift و SQLite را به فایل pubspec.yaml پروژه اضافه کنید. این کار را با قرار دادن خطوط زیر انجام دهید:
dependencies: drift: ^2.20.2 drift_flutter: ^0.2.0 sqlite3_flutter_libs: ^0.7.0 dev_dependencies: drift_dev: ^2.20.2 build_runner: ^2.3.0
پس از نصب پکیجها، باید یک کلاس برای مدیریت اتصال به دیتابیس ایجاد کنید. این کلاس وظیفه باز کردن و مدیریت دیتابیس را بر عهده دارد.
یک فایل Dart جدید به نام my_database.dart بسازید (نام اختیاری) و کد زیر را در آن وارد کنید:
import 'dart:io'; import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; part 'my_database.g.dart'; این خط کد موقع وارد کردن با خطا هست که جلوتر حلش میکنیم @DriftDatabase( tables: [Master, Details], // جداول پایگاه داده ) class MyDatabase extends _$MyDatabase { MyDatabase() : super(_openConnection()); @override int get schemaVersion => 1; } LazyDatabase _openConnection() { return LazyDatabase(() async { final dbFolder = await getApplicationDocumentsDirectory(); final file = File(p.join(dbFolder.path, 'my_db.sqlite')); return NativeDatabase(file); }); }
در Drift، جداول دیتابیس با استفاده از کلاسهای Dart تعریف میشوند. برای مثال، یک جدول به نام Master به شکل زیر تعریف میشود:
class Master extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get title => text().withLength(min: 1, max: 50)(); IntColumn get processID => integer()(); }
پس از تعریف جداول، با اجرای دستور زیر، کدهای مورد نیاز تولید میشوند ( بخصوص my_database.g.dart):
flutter pub run build_runner build
پس از تنظیمات اولیه، دیتابیس شما آماده استفاده است. حال میتوانید از کوئریهای واکنشگرا و ساده Drif برای تعامل با داده ها در اپلیکیشن Flutter خود استفاده کنید.
خب خب حالا بحث شیرین چالش و باگ ها
استفاده از Drift در اپلیکیشنهای Flutter که برای پلتفرمهای مختلفی همچون وب، ویندوز، اندروید و iOS طراحی شدهاند، با چالشها و باگ هایی همراه است. یکی از مهمترین چالش ها، اجرای Drift در پلتفرم وب است، زیرا وب برخلاف پلتفرم های دیگر مانند اندروید یا ویندوز، از کتابخانه های محلی (native libraries) مانند dart:ffi برای دسترسی به SQLite پشتیبانی نمیکند. در ادامه به برخی از مهمترین چالش های استفاده از Drift در وب و مشکلات احتمالی آن میپردازیم:
dart:ffi در وبیکی از چالش های اساسی اجرای Drift در وب، عدم پشتیبانی مرورگرها از کتابخانه های مبتنی بر FFI (Foreign Function Interface) است. Drift از SQLite استفاده میکند که نیازمند تعامل مستقیم با سیستم عامل است، اما این امکان در وب وجود ندارد. به همین دلیل، برای اجرای Drift در وب، باید از drift/web(منسوخ شده) و IndexedDB به جای SQLite استفاده شود.
راهحل: در هنگام پیکربندی Drift در اپلیکیشن وب، به جای استفاده از NativeDatabase، از WebDatabase استفاده میکنیم که به IndexedDB، یک دیتابیس داخلی در مرورگرها، متصل میشود:
LazyDatabase _openConnection() { if (kIsWeb) { return LazyDatabase(() async { return WebDatabase('app_db'); }); } else { // استفاده از NativeDatabase برای پلتفرمهای موبایل و دسکتاپ final dbFolder = await getApplicationDocumentsDirectory(); final file = File(p.join(dbFolder.path, 'app_db.sqlite')); return NativeDatabase(file); } }
IndexedDBIndexedDB که Drift از آن در وب استفاده میکند، به عنوان یک دیتابیس مرورگر عمل میکند، اما دارای محدودیت هایی است:
IndexedDB محدود است و اگر برنامه شما حجم زیادی از داده ها را ذخیره کند، ممکن است به محدودیت برخورد کنید.IndexedDB به طور کلی از لحاظ عملکرد، به ویژه در حجم بالای داده، کندتر از SQLite است. این میتواند در اپلیکیشنهایی که حجم زیادی از دادهها را پردازش میکنند، مشکل ساز شود.یکی دیگر از چالش ها در اجرای Drift در وب، همگامسازی داده ها بین پلتفرم های مختلف است. اگر اپلیکیشن شما در وب، موبایل و دسکتاپ اجرا شود، داده ها به طور پیشفرض در هر پلتفرم جداگانه ذخیره میشوند. این مسئله میتواند مشکل همگام سازی دادهها بین نسخه های مختلف اپلیکیشن را به همراه داشته باشد.
عملکرد Drift در وب ممکن است در برخی مرورگرها دچار مشکل شود. به عنوان مثال، نسخه های قدیمی مرورگرهایی مانند Safari یا Internet Explorer از IndexedDB به درستی پشتیبانی نمیکنند و ممکن است برنامه شما با خطا مواجه شود.
در وب، امنیت و حریم خصوصی داده ها از اهمیت ویژهای برخوردار است. IndexedDB به صورت محلی در مرورگر کاربر ذخیره میشود و ممکن است داده های حساس اپلیکیشن شما در معرض خطر قرار بگیرد.
مرورگرها به دلیل محدودیت های ذاتی که دارند، امکان اجرای کدهای سنگین و عملیات پیچیده را به همان شکلی که در دسکتاپ یا موبایل وجود دارد، نمیدهند. این مسئله میتواند برای Drift، که با دیتابیس های حجیم سر و کار دارد، محدودیتهایی ایجاد کند.
_____________________________________________________________________________________________
در کل، اگرچه Drift ابزار قدرتمندی برای مدیریت دیتابیسها است، اما در پلتفرم وب به دلیل محدودیتهای موجود باید با دقت و تغییراتی خاص مورد استفاده قرار گیرد.
قربان شما ; سید سعید غفوری