آموزش دیتابیس Objectbox
آموزش دیتابیس Hive
آموزش دیتابیس Sqlite
ذخیره سازی اطلاعات در هر نرم افزاری یکی از موارد بسیار ضروری میباشد که به عنوان یک برنامه نویس باید به ابعاد مختلف آن فکر کنید.
در زمینه برنامه نویسی فلاتر دیتابیس های مختلفی برای ذخیره سازی اطلاعات وجود دارد که موارد پرکاربرد آن را معرفی کرده ایم.
یکی از دیتابیس های محبوب در زمینه برنامه نویسی موبایل دیتابیس Realm می باشد که در زمینه برنامه نویسی نیتیو با زبان کاتلین نیز بسیار پرکاربرد میباشد. این دیتابیس از نوع NoSQL میباشد.
برای استفاده بهتر از این مطلب نیاز به آموزش فلاتر دارید.
دیتابیس Realm یک سیستم مدیریت دیتابیس object-oriented است که برای توسعه دهندگان اپلیکیشن های موبایل و دسکتاپ که توسط تیم MongoDB طراحی شده است. این دیتابیس بر روی دستگاه کاربر اجرا می شود و به همین دلیل به آن دیتابیس امبد شده (embedded database) نیز گفته می شود.
این سیستم مدیریت دیتابیس برای اندروید (Android)، iOS، و دیگر پلتفرمهای موبایل قابل استفاده است. Realm به توسعهدهندگان اجازه میدهد دادههای برنامه خود را به سرعت و با کارآیی بالا ذخیره و بازیابی کنند.
نکته مهم که باید به آن توجه کنید این است که Realm یک نوع ORM نیست بلکه یک دیتابیسی است که از ابتدا با هدف استفاده در گوشی های هوشمند طراحی شده و برای اینکار بهینه سازی های مختلفی روی آن اعمال شده است.
هسته مرکزی این پایگاه داده با زبان C++ برنامه نویسی شده است.
دیتابیس Realm از ویژگی های زیر برخوردار است:
دیتابیس Realm برای انواع مختلفی از اپلیکیشن ها قابل استفاده است، از جمله:
گفتیم که Realm یک نوع دیتابیس شی گرا است و هیچ ارتباطی با ORM ها ندارد. در واقع این پایگاه داده از نوع شی گرایی است و قصد داریم تا بررسی کنیم این به چه معنی است؟
دیتابیس شی گرایی یک سیستم مدیریت پایگاه داده است که در آن اطلاعات در قالب اشیاء نمایش داده می شوند، که مشابه همان شیءهایی است که در برنامه نویسی شیءگرا استفاده می شوند. پایگاه داده های شیء با پایگاه داده رابطه ای (که مبتنی بر جدول هستند) متفاوت اند.
در یک پایگاه داده رابطه ای، اطلاعات در قالب جداول، ستون ها و ردیف ها ذخیره می شوند. هر جدول یک مجموعه از داده های مرتبط را ذخیره می کند، و هر ستون یک نوع داده خاص را ذخیره می کند. ردیف ها یک نمونه از داده ها را در یک جدول ذخیره می کنند.
در یک پایگاه داده شیء، اطلاعات در قالب اشیاء ذخیره می شوند. هر شیء یک مجموعه از ویژگی ها و رفتارها را دارد. ویژگی ها داده های مربوط به شی را ذخیره می کنند، و رفتارها اقداماتی را که شی می تواند انجام دهد تعریف می کنند.
دیتابیس های شی گرا مزایای زیر را نسبت به پایگاه داده های رابطه ای دارند:
در کل، دیتابیسهای شی گرایی مناسب برای برنامههایی هستند که دارای دادههای پیچیده و با ساختار شی گرایی هستند، مانند اپلیکیشنهای تحت وب، سیستمهای اطلاعات جغرافیایی (GIS)، بازیهای ویدئویی، و سایر برنامههایی که نیاز به مدیریت دادههای پیچیده و اشیاء دارند.
همانطور که گفتیم Realm دیتابیسی است که از ابتدا با هدف استفاده در اپلیکیشن های موبایل طراحی شده است و همین مورد باعث برتری آن نسبت به سایر گزینه ها میباشد.
شی گرایی بودن این پایگاه داده نیز باعث میشود تا نیازی به نوشتن کوئری های پیچیده نداشته باشید و به سادگی از آن استفاده کنید.
برای شروع ابتدا با دستور زیر پکیج مورد نیاز را به پروژه فلاتر اضافه میکنیم.
flutter pub add realm
dart run realm install
بعد از اضافه کردن پکیج های مورد نیاز کلاس مدل خود را میسازیم.
در این مثال یک کلاس دانشجو در اختیار داریم که عملیات crud را روی انجام میدیم.
یک فایل به نام student ایجاد میکنیم.
import 'package:realm/realm.dart';
@RealmModel()
class _Student {
@PrimaryKey()
int? id;
String? firstName;
String? lastName;
}
در این کلاس با @RealmModel() مشخص کرده ایم که از این کلاس برای ذخیره سازی اطلاعات استفاده خواهیم کرد.
با کمک @PrimaryKey() نیز کلید اصلی پایگاه داده را مشخص میکنیم کدام فیلد باشد.
در ابتدای این فایل عبارت part ‘student.g.dart’; را نیز باید قرار دهید, این تکه در ادامه کدهای مورد نیاز کلاس را ایجاد میکند.
با اجرای دستور زیر در ترمینال کدهایی که برای ذخیره اطلاعات این کلاس در دیتابیس نیاز ساخته میشود.
dart run realm generate
برای اینکه کدهای بخش دیتابیس به شکل تمیز نوشته شوند یک کلاس جدا به نام StudentDatabase ایجاد میکنیم و تمام متدهای مورد نیاز برای انجام عملیات CRUD را در آن قرار میدهیم.
کدهای کلاس به شکل زیر میباشد.
import 'package:realm/realm.dart';
class StudentDatabase {
// دسترسی به دیتابیس Realm
var config = Configuration.local([Car.schema]);
final Realm realm = Realm(config );
// افزودن یک دانشجو به دیتابیس
void addStudent(Student student) {
realm.write(() {
realm.create<Student>(student, update: true);
});
}
// خواندن همه دانشجویان از دیتابیس
List<Student> getAllStudents() {
final students = realm.objects<Student>().toList();
return students;
}
// جستجوی دانشجو بر اساس شناسه
Student? findStudentById(int id) {
return realm.object<Student>(id);
}
// بهروزرسانی یک دانشجو در دیتابیس
void updateStudent(Student student) {
realm.write(() {
realm.create<Student>(student, update: true);
});
}
// حذف یک دانشجو از دیتابیس
void deleteStudent(int id) {
realm.write(() {
final student = realm.object<Student>(id);
realm.delete(student);
});
}
}
در این کلاس یک نمونه از کلاس Realm میسازیم که برای پارامتر ورودی از آبجکت config که مشخص کننده کلاس مدل است استفاده میکنیم.
در ادامه چهار متد میسازیم که هر کدام عملیات CRUD را انجام میدهند.
برای ذخیره سازی اطلاعات از دستور realm.write استفاده میکنیم, اگر مقدار update را برابر true قرار دهید در صورت وجود رکورد آن را آپدیت میکند.
برای دریافت لیست کامل رکوردهای یک کلاس از دستور realm.objects().toList() میتوانید استفاده کنید.
اگر قصد جستجو در میان رکوردهای ثبت شده را براساس آیدی دارید از این دستور استفاده میتوانید کنید realm.object<Student>(id)
در متد deleteStudent هم که برای حذف اطلاعات در نظر گرفته ایم ابتدا رکورد مورد نظر را در پایگاه داده جستجو میکنیم و سپس آن را پاک میکنیم.
حالا کافیست هر زمان عملیات که میخواهیم روی دیتابیس انجام دهیم از این کلاس یک نمونه ایجاد کنیم.
به مثال زیر توجه کنید.
void main() {
final studentDatabase = StudentDatabase();
// افزودن یک دانشجو
final student1 = Student(1, "علی", "رضایی");
studentDatabase.addStudent(student1);
// خواندن تمام دانشجوها
final students = studentDatabase.getAllStudents();
print("لیست دانشجویان:");
students.forEach((student) {
print("${student.firstName} ${student.lastName}");
});
// جستجو و بهروزرسانی یک دانشجو
final studentToUpdate = studentDatabase.findStudentById(1);
if (studentToUpdate != null) {
studentToUpdate.firstName = "محمد";
studentDatabase.updateStudent(studentToUpdate);
print("دانشجو بهروزرسانی شد.");
}
// حذف یک دانشجو
studentDatabase.deleteStudent(1);
print("دانشجو حذف شد.");
}
این مثال یک دیتابیس Realm ایجاد کرده، دادههای دانشجو را به آن اضافه کرده، آنها را خوانده، بهروزرسانی کرده و سپس یکی از دانشجوها را حذف کرده است.
این نمونه به شما یک ایده از چگونگی استفاده از Realm در فریمورک فلاتر میدهد.
اگر قصد استفاده از دیتابیس NoSQL را دارید Realm یکی از بهترین گزینه هاست.