چرا و چگونگی استفاده از realm اونقدر واضحه که من میخوام باز هم دربارش بگم این دوست عزیز دانمارکی دقیقا مثل شیرینی دانمارکی خوشمزه دوست داشتنی و طبیعتا شیرینیه چیزی که اینجا میخونید راهکار ساده و سریع برای استفاده از پایگاه داده ریل ام هست ساده سریع و به همون شدت آسون برای رهایی از کوئری زدن های نامانوس در SQLITE به دامان ریل ام چنگ بزنید و متفرق نشوید! :)
قصه از اونجایی شروع شد که من همیشه از sql فراری بودم هیچوقتم دوستش نداشتم :| اکثر پروژه هایی که انجام دادم و کد هایی که تو این چند سال نوشته بودم عملا کلاینت های اندرویدی بودن که بود و نبودشون به سرور و دیتای ارسالی از بکند گره خورده بود ولی یه جایی تصمیم گرفتم قورباغه رو قورت بدم و بگردم ببینم چجوری میتونم کار با sqlite رو بدون دردخونریزی تجربه کنم خب کلی ORM خوب وجود داره که بدون نیاز به نوشتن query دنیا رو قشنگتر میکنن منم داشتم بینشون میچرخیدم که به دوست نازنینی برخوردم که جذابیتش منو تحت تاثیر قرار داد و اون دوست گرامی چیزی نبود جز Realm
ریل ام یک ORM برای استفاده از SQLITE نیست
بلکه دقیقا یک جایگزین زیبا و جذاب برای sqlite هست که و به نوعی میشه بهش گفت اولین پایگاه داده شی گرا برای موبایل. ریل ام از هسته c++ استفاده میکنه و یک پایگاه داده مبتنی بر table در اختیار کاربر قرار میده خب برای اینکه بهتر بشه با sqlite مقایسه اش کرد باید یه جمع بندی کلی داشته باشیم
طبق آماری که خود توسعه دهنده های realm دادن حدودا 100 هزار توسعه دهنده در حال حاضر از realm استفاده میکنن که خب نشون میده میتونه جایگزین خوب و مناسبی برای SQLITE تو بحث موبایل ( بطور مشخص منظور من اندروید هست قابلیت استفاده در IOS هم داره) هست
چیزی که در ادامه نوشته شده صرفا یک توضیح ساده و آموزش CRUD در REALM هست نحوه استفاده از قابلیت های دیگه مثل notification و... رو میتونید تو سایت اصلی پیدا کنید
کافیه این چند خط زیر رو در build.gradle پروژه اضافه کنید
buildscript { repositories { jcenter() } dependencies { classpath "io.realm:realm-gradle-plugin:5.8.0" } }
بالای build.gradle اپلیکیشن این یک خط رو اضافه کنید:
apply plugin: 'realm-android'
خب حالا کافیه ابزار دور زدن تحریم رو روشن کنید و صبر کنید gradle سینک شه
حالا توی اکتیوی extend شده از اپلیکیشن یا MainActivity تون realm رو باید initialize کنید اونم به سادگی
Realm.init(this);
تو مرحله بعد باید دیتا بیس رو بسازیم قطعا وقتی دیتا بیس میسازیم و فانکشن های crud مینویسیم باید برای ایجاد دیتا بیس از singleton استفاده کنید و خب بدیهیه ولی گفتم تذکر بدم تا مبادا هربار که شی جدید ساخته میشه یه دیتا بیس با همون نام ساخته شه چون اگر این کار کنید قطعا به در و دیوار برخورد میکنید :) پس یک بار initialize و یک بار ایجاد دیتا بیس و به تعداد مختلف crud .
Realm DBname = Realm.getDefaultInstance();
قبل از هرکار دیگه باید object درست کنیم من اینجا فرض میکنم قراره یه تعداد کتاب ذخیره کنیم پس اینجوری میشه
public class Book extends RealmObject { @PrimaryKey private int id; private String title; private String description; private String author; // Standard getters & setters generated by your IDE…
و برای هرکدوم getter و setter تولید میکنیم البته ما که تولید نمیکنیم android studio این کارو میکنه
تا اینجای کار تقریبا همه چیز محیاست تا بتونیم دیتا ذخیره کنیم اپدیت کنیم بخونیم و پاک کنیم قدم اول باید دیتا بنویسیم :
DBname.beginTransaction(); Book book = DBname.createObject(Book.class); book.setId("1325"); book.settitle("realmbook"); book.setauthor("sajad"); book.setdescription("its about Realm DB"); DBname.commitTransaction();
به همین سادگی ما یه شی کتاب به پایگاه داده مون اضافه کردیم بریم سراغ خوندن داده ها از پایگاه داده مون:
//Read all data RealmResults<Book> results = DBname.where(Book.class).findAll(); for(Book book : results){ System.out.println(book.gettitle() + " " + book.getauthor()); } //Read specific data RealmResults<Book> results = DBname.where(Book.class).equalTo("id", 1235).findAll();
آپدیت کردن و به روز کردن داده ها در realm:
RealmResults<Book> results = DBname.where(Book.class).equalTo("id", 20).findAll(); DBname.beginTransaction(); for(Book book : results){ Book.settitle("new Realm book"); } DBname.commitTransaction();
پاک کردن داده های در realm با کدهای زیر انجام میشه:
RealmResults<Book> results = Dbname.where(Book.class).findAll(); DBname.beginTransaction(); // remove single match results.deleteFirstFromRealm(); results.deleteLastFromRealm(); // remove a single object Book book = results.get(5); book.deleteFromRealm(); // Delete all matches results.deleteAllFromRealm(); DBname.commitTransaction();
در آخر هم باید بگم realm قابلیت های جذاب زیادی داره که میشه ازش استفاده کرد تا بهترین نتیجه رو بتونیم بگیریم علاوه بر اون سرویس کلود برای اپلیکیشن ارائه میده که البته ما جز دور افتاده از بقیه دنیا محسوب میشیم :)
امیدوارم مفید بوده باشه توضیحات و قطعا درصورت انتقاد و یادآوری مشکلاتی که احیانا از چشم من دور مونده بنده رو شاد میکنید
منابع:
آپدیت: یکی از بزرگترین مشکلات من در استفاده از realm بالابردن حجم برنامه به شکل قابل توجهی (حدود 5 مگابایت) بود که باعث شد طی یک عملیات سریع برم سمت RoomDB که هم سرعت خوبی داره هم ساده و سبک هست