آموزش کامل Drift در Flutter: از شروع تا مقابله با چالش‌ها

  • معرفی کوتاه Drift به عنوان یک ORM قوی در Flutter.
  • اهمیت مدیریت دیتابیسهای محلی در توسعه اپلیکیشنها.
  • بیان مختصر اهداف مقاله و مزایای استفاده از Drift.

فریمورک قدرتمند و متن باز گوگل به نام فلاتر و توسعه داده شده با زبان دارت ، به توسعه دهندگان این امکان را میدهد که با یک بار نوشتن کد، اپلیکیشن های زیبایی برای پلتفرم های مختلف مانند اندروید، iOS، وب و دسکتاپ ایجاد کنند.

Drift چیست؟

Drift یک ORM (Object-Relational Mapping) قدرتمند برای کار با پایگاه داده SQLite در اپلیکیشن های Flutter و Dart است. این کتابخانه به توسعه دهندگان اجازه میدهد تا با استفاده از کدهای Dart به سادگی کوئری های SQL را نوشته و مدیریت کنند، بدون نیاز به نوشتن مستقیم SQL. Drift امکاناتی همچون کوئری های قابل ترکیب، واکنش گرایی (Reactive) در دیتابیس، و تولید خودکار کدهای مرتبط با جداول را فراهم میکند. به طور خلاصه، Drift ارتباط بین اپلیکیشن و پایگاه داده را بسیار ساده و منعطف میسازد و امکان مدیریت دادهها در یک ساختار منظم و بهینه را فراهم میکند.

یکی از مزایای کلیدی Drift، سازگاری با پلتفرم های مختلف است؛ از ویندوز و اندروید گرفته تا وب، این کتابخانه به توسعه دهندگان کمک میکند تا بدون نگرانی از جزئیات پیچیده هر پلتفرم، به راحتی دیتابیس خود را مدیریت کنند.


برای شروع استفاده از Drift در پروژه Flutter، ابتدا باید این کتابخانه را نصب و پیکربندی کنید. Drift به راحتی با SQLite ادغام میشود و امکاناتی مانند کوئری نویسی ساده، مدیریت جداول و تعامل واکنشگرا با دیتابیس را فراهم می آورد. در این بخش، مراحل نصب و تنظیمات اولیه Drift را بررسی میکنیم.

1. اضافه کردن کتابخانههای مورد نیاز

ابتدا باید کتابخانه های 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
  • drift: هسته اصلی Drift است که امکان نوشتن کوئریهای دیتابیس و مدیریت دادهها را فراهم میکند.
  • drift_flutter: برای استفاده Drift در Flutter، به این پکیج نیاز داریم.
  • sqlite3_flutter_libs: شامل باینری های SQLite برای استفاده در اندروید و iOS است.
  • drift_dev و build_runner: این کتابخانه ها برای تولید خودکار کدهای مربوط به جداول و کوئریها استفاده میشوند.

2. تنظیمات دیتابیس

پس از نصب پکیجها، باید یک کلاس برای مدیریت اتصال به دیتابیس ایجاد کنید. این کلاس وظیفه باز کردن و مدیریت دیتابیس را بر عهده دارد.

یک فایل 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);
  });
}


3. ساخت جداول دیتابیس

در 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

4. اجرای Drift

پس از تنظیمات اولیه، دیتابیس شما آماده استفاده است. حال میتوانید از کوئریهای واکنشگرا و ساده 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);
  }
}

محدودیتهای IndexedDB

IndexedDB که Drift از آن در وب استفاده میکند، به عنوان یک دیتابیس مرورگر عمل میکند، اما دارای محدودیت هایی است:

  • محدودیت حجم داده: در برخی مرورگرها (مانند Safari)، حجم دادههای ذخیره شده در IndexedDB محدود است و اگر برنامه شما حجم زیادی از داده ها را ذخیره کند، ممکن است به محدودیت برخورد کنید.
  • سرعت پایین تر نسبت به SQLite: IndexedDB به طور کلی از لحاظ عملکرد، به ویژه در حجم بالای داده، کندتر از SQLite است. این میتواند در اپلیکیشنهایی که حجم زیادی از دادهها را پردازش میکنند، مشکل ساز شود.

مشکلات همگام سازی داده بین پلتفرم ها

یکی دیگر از چالش ها در اجرای Drift در وب، همگامسازی داده ها بین پلتفرم های مختلف است. اگر اپلیکیشن شما در وب، موبایل و دسکتاپ اجرا شود، داده ها به طور پیشفرض در هر پلتفرم جداگانه ذخیره میشوند. این مسئله میتواند مشکل همگام سازی دادهها بین نسخه های مختلف اپلیکیشن را به همراه داشته باشد.

  • راه حل احتمالی: استفاده از راهکارهایی مانند APIهای سمت سرور یا Firebase برای همگامسازی داده ها بین پلتفرم های مختلف میتواند این مشکل را حل کند.

خطاهای سازگاری با مرورگرهای مختلف

عملکرد Drift در وب ممکن است در برخی مرورگرها دچار مشکل شود. به عنوان مثال، نسخه های قدیمی مرورگرهایی مانند Safari یا Internet Explorer از IndexedDB به درستی پشتیبانی نمیکنند و ممکن است برنامه شما با خطا مواجه شود.

  • راه حل: تست کامل برنامه در مرورگرهای مختلف و استفاده از polyfillها یا راهکارهای جایگزین برای رفع مشکلات سازگاری میتواند کمک کننده باشد.

مدیریت ایمنی و امنیت دادهها

در وب، امنیت و حریم خصوصی داده ها از اهمیت ویژهای برخوردار است. IndexedDB به صورت محلی در مرورگر کاربر ذخیره میشود و ممکن است داده های حساس اپلیکیشن شما در معرض خطر قرار بگیرد.

  • راه حل: استفاده از رمزنگاری برای محافظت از داده های حساس و پیادهسازی مکانیسم های امنیتی سمت سرور برای مدیریت بهتر داده ها.

محدودیت های مرورگر در توسعه وب اپلیکیشن ها

مرورگرها به دلیل محدودیت های ذاتی که دارند، امکان اجرای کدهای سنگین و عملیات پیچیده را به همان شکلی که در دسکتاپ یا موبایل وجود دارد، نمیدهند. این مسئله میتواند برای Drift، که با دیتابیس های حجیم سر و کار دارد، محدودیتهایی ایجاد کند.

_____________________________________________________________________________________________

در کل، اگرچه Drift ابزار قدرتمندی برای مدیریت دیتابیسها است، اما در پلتفرم وب به دلیل محدودیتهای موجود باید با دقت و تغییراتی خاص مورد استفاده قرار گیرد.

قربان شما ; سید سعید غفوری