کتابخانه Drift که بود و چه کرد؟ (1)

مقدمه ای بر کتابخانه Drift در Flutter


قسمت اول

توی این مقاله میخوام در مورد دیتابیس Drift صحبت کنم. سیستم های مدیریت داده متعدد و متفاوتی داخل فلاتر وجود داره که ممکنه کم و بیش با اونا آشنایی داشته باشید؛ مثل Drift، Hive، Sqflite، GetX Storage و.. .

بعضی از این DBMSها از نوع Relational هستند؛ مثل Sqflite و Drift، بعضی دیگه شون هم مثل Hive از مدل NoSql هستند. هرکدوم از این ها مزیت و عیب خودشون رو دارند که فعلا مورد بحث ما نیست :)


از هرچه بگذریم سخن Drift خوشترست..

کتابخونه Drift (که قبلا از اسمش Moor بوده) مخصوص برنامه های Dart و Flutter هست که از همه ی پلتفرم ها هم پشتیبانی میکنه. برنامه نویس به دو صورت میتونه کوئری هایی که درنظر داره رو بنویسه؛ هم به زبان Dart و هم SQL. اولین کار اینه که این پکیج به پروژه مون اضافه کنیم:

نصب:

dependencies:
  drift: ^2.0.2+1
  sqlite3_flutter_libs: ^0.5.0
  path_provider: ^2.0.0
  path: ^1.8.2

dev_dependencies:
  drift_dev: ^2.0.2
  build_runner: ^2.2.0

شاید فکر کنید واقعا نصب همه ی این پکیج ها لازمه؟ باید بهتون بگم بله بله؛ drift که خود دیتابیس مون هست. drift بر مبنای sqlite3ساخته شده sqlite3_flutter_libs بیشتر برای پلتفرم های موبایل کاربرد داره، اگر شما از فلاتر استفاده نمی کنید، می تونید (با مسئولیت خودتون) نصبش نکنید. این دیتابیس هایی که گفتیم همه شون اطلاعات روی دستگاه به صورت لوکال ذخیره میکنن و طبیعتاً باید یه جای درست و حسابی برای دیتا پیدا بشه، برای همین پکیج های path_provider و path رو به پروژه اضافه می کنیم. دو تا پکیج آخر رو هم برای جنریت شدن کد ها و کوئری ها لازم داریم.


حالا که Drift رو نصب کردیم، کار اصلی شروع میشه. بالاتر بهتون گفتم که به دو روش میشه دیتابیس رو طراحی کرد و کار رو پیش برد. در روش اول از زبان Dart کمک می گیریم:

اولین کاری که باید انجام بدیم، پیاده سازی جدول(ها)مون هست. به مدد این کتابخونه، خیلی شیک Table ها طراحی میشن:

جدول Category:

جدول Category
جدول Category


جدول Note:

جدول Note
جدول Note


باتوجه به اینکه نوع ستون های جدول چی هست می تونید از IntColumn، TextColumn، BoolColumn، DateTimeColumnو RealColumnاستفاده کنید. اگر بخواهید برای اون فیلد مقدار دیفالت تعریف کنید از تابع withDefaultاستفاده می کنید و مقداری که مدنظر دارید رو بهش پاس می دید. تابع namedزمانی عرض اندام می کنه که تمایل داشته باشید اسم یک فیلد توی پایگاه داده متفاوت از اسم getter اون باشه. بقیه موارد بنظر واضح میاد تا برسیم به مبحث کلید های اصلی و خارجی.

برای تعریف کلید(ها) اصلی جدول تون می تونید primaryKeyرو override کنید و ستون های لازم رو بهش معرفی کنید؛ به همین راحتی، به همین خوشمزگی.

اگر داخل جدول تون فیلدی داشته باشید که رفرنسی از یک جدول دیگه باشه (همون Foreign key خودمون)، برای اون هم یک تابع reference داریم که یک چندتا پارامتر اجباری و اختیاری داره. ورودی های اجباری اون اسم جدول مبدا و اسم ستون هست. دو تا پارامتر اختیاری هم برای Referential Actions داره که با استفاده از KeyActionمیتونید اکشن مدنظر تون رو استفاده کنید.


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

database.dart
database.dart


داخل DrfitDatabase@ باید جدول ها و viewهایی(اگر داریم) که تعریف کردیم به این کلاس معرفی کنیم. در صورتی که بخوایم زمانی که دیتابیس داره ساخته میشه یا اپدیت میشه و.. کانفیگ های به خصوصی انجام بدیم، میتونیم تابع migration رو override کنیم. این تابع یک MigrationStrategyبرمیگردونه که 3 تا تابع در ورودی به صورت دلخواه دریافت میکنه؛ onCreate، onUpgrade و beforeOpen.

یادتون نره این کامند رو باید اجرا کنید، تا فایل database.g.dart تولید بشه:

flutter pub run build_runner build

بعد از اینکه این فایل جنریت شد، به ازای هر کدوم از این جدول هایی که تعریف کردیم، دوتا کلاس تولید میشه (مثلا NoteData و NoteCampanion) که هرکدوم کاربرد خودشو داره.

توی پست بعدی، نحوه ی پیاده سازی کوئری ها رو بررسی میکنیم ;)

تا اینجای کار مرسی که خوندین، منتظر نظراتتون هستم *_*