یلدا محصلی؛ برنامه نویس فلاتر، دبیر کامپیوتر
کتابخانه 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:
جدول Note:
باتوجه به اینکه نوع ستون های جدول چی هست می تونید از IntColumn
، TextColumn
، BoolColumn
، DateTimeColumn
و RealColumn
استفاده کنید. اگر بخواهید برای اون فیلد مقدار دیفالت تعریف کنید از تابع withDefault
استفاده می کنید و مقداری که مدنظر دارید رو بهش پاس می دید. تابع named
زمانی عرض اندام می کنه که تمایل داشته باشید اسم یک فیلد توی پایگاه داده متفاوت از اسم getter اون باشه. بقیه موارد بنظر واضح میاد تا برسیم به مبحث کلید های اصلی و خارجی.
برای تعریف کلید(ها) اصلی جدول تون می تونید primaryKey
رو override کنید و ستون های لازم رو بهش معرفی کنید؛ به همین راحتی، به همین خوشمزگی.
اگر داخل جدول تون فیلدی داشته باشید که رفرنسی از یک جدول دیگه باشه (همون Foreign key خودمون)، برای اون هم یک تابع reference داریم که یک چندتا پارامتر اجباری و اختیاری داره. ورودی های اجباری اون اسم جدول مبدا و اسم ستون هست. دو تا پارامتر اختیاری هم برای Referential Actions داره که با استفاده از KeyAction
میتونید اکشن مدنظر تون رو استفاده کنید.
خب حالا که جدول ها مون رو تعریف کردیم یه کلاس لازم داریم که دیتابیس مون رو مدیریت کنیم؛ این شکلی:
داخل DrfitDatabase@
باید جدول ها و viewهایی(اگر داریم) که تعریف کردیم به این کلاس معرفی کنیم. در صورتی که بخوایم زمانی که دیتابیس داره ساخته میشه یا اپدیت میشه و.. کانفیگ های به خصوصی انجام بدیم، میتونیم تابع migration
رو override کنیم. این تابع یک MigrationStrategy
برمیگردونه که 3 تا تابع در ورودی به صورت دلخواه دریافت میکنه؛ onCreate
، onUpgrade
و beforeOpen
.
یادتون نره این کامند رو باید اجرا کنید، تا فایل database.g.dart
تولید بشه:
flutter pub run build_runner build
بعد از اینکه این فایل جنریت شد، به ازای هر کدوم از این جدول هایی که تعریف کردیم، دوتا کلاس تولید میشه (مثلا NoteData و NoteCampanion) که هرکدوم کاربرد خودشو داره.
توی پست بعدی، نحوه ی پیاده سازی کوئری ها رو بررسی میکنیم ;)
تا اینجای کار مرسی که خوندین، منتظر نظراتتون هستم *_*
مطلبی دیگر از این انتشارات
ویجت FutureBuilder و بارگیری مجدد future در فلاتر
مطلبی دیگر از این انتشارات
کد تمیز گلی از گل های گیتهاب است
مطلبی دیگر از این انتشارات
فلاتر وب - mouse effect (قسمت دوم)