بلعیدن شیرینی دانمارکی یا راهکاری برای قورت دادن استوانه ها

چرا و چگونگی استفاده از realm اونقدر واضحه که من میخوام باز هم دربارش بگم این دوست عزیز دانمارکی دقیقا مثل شیرینی دانمارکی خوشمزه دوست داشتنی و طبیعتا شیرینیه چیزی که اینجا میخونید راهکار ساده و سریع برای استفاده از پایگاه داده ریل ام هست ساده سریع و به همون شدت آسون برای رهایی از کوئری زدن های نامانوس در SQLITE به دامان ریل ام چنگ بزنید و متفرق نشوید! :)قصه از کجا شروع شد...قصه از اونجایی شروع شد که من همیشه از sql فراری بودم هیچوقتم دوستش نداشتم :| اکثر پروژه هایی که انجام دادم و کد هایی که تو این چند سال نوشته بودم عملا کلاینت های اندرویدی بودن که بود و نبودشون به سرور و دیتای ارسالی از بکند گره خورده بود ولی یه جایی تصمیم گرفتم قورباغه رو قورت بدم و بگردم ببینم چجوری میتونم کار با sqlite رو بدون دردخونریزی تجربه کنم خب کلی ORM خوب وجود داره که بدون نیاز به نوشتن query دنیا رو قشنگتر میکنن منم داشتم بینشون میچرخیدم که به دوست نازنینی برخوردم که جذابیتش منو تحت تاثیر قرار داد و اون دوست گرامی چیزی نبود جز Realmریل ام (realm)چیست؟ریل ام یک ORM برای استفاده از SQLITE نیستبلکه دقیقا یک جایگزین زیبا و جذاب برای sqlite هست که و به نوعی میشه بهش گفت اولین پایگاه داده شی گرا برای موبایل. ریل ام از هسته c++ استفاده میکنه و یک پایگاه داده مبتنی بر table در اختیار کاربر قرار میده خب برای اینکه بهتر بشه با sqlite مقایسه اش کرد باید یه جمع بندی کلی داشته باشیمبرتری های نسبت به SQLITE :سرعت بالاتر (تا ده برابر سریعتر )استفاده ساده تربا اشیا (objects) بهتر کار میکنهبا داده های پویا و روی هوا (on the fly) بهتر کار میکنهپشتیبانی قوینقاط ضعف نسبت به SQLITE :قابلیت import نداردهمچنان در حال توسعه محتوای آموزشی کمتری درباره اش منتشر شدهنمیتوان در طول thread به اشیا دسترسی داشتقابلیت های مهم :پشتیبانی از nullپشتیبانی از نقشهقابلیت migrate آساناعلان تغییر یک داده خاصقابلیت استفاده از کلید های اصلی (primary key)مرکبطبق آماری که خود توسعه دهنده های realm دادن حدودا 100 هزار توسعه دهنده در حال حاضر از realm استفاده میکنن که خب نشون میده میتونه جایگزین خوب و مناسبی برای SQLITE تو بحث موبایل ( بطور مشخص منظور من اندروید هست قابلیت استفاده در IOS هم داره) هستچیزی که در ادامه نوشته شده صرفا یک توضیح ساده و آموزش CRUD در REALM هست نحوه استفاده از قابلیت های دیگه مثل notification و... رو میتونید تو سایت اصلی پیدا کنیداستفاده از REALMاضافه کردن به پروژه:کافیه این چند خط زیر رو در build.gradle پروژه اضافه کنیدbuildscript { repositories { jcenter() } dependencies { classpath &quotio.realm:realm-gradle-plugin:5.8.0&quot } }بالای 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(&quot1325&quot); book.settitle(&quotrealmbook&quot); book.setauthor(&quotsajad&quot); book.setdescription(&quotits about Realm DB&quot); DBname.commitTransaction();خواندن داده های ذخیره شده:به همین سادگی ما یه شی کتاب به پایگاه داده مون اضافه کردیم بریم سراغ خوندن داده ها از پایگاه داده مون://Read all data RealmResults<‌Book> results = DBname.where(Book.class).findAll(); for(Book book : results){ System.out.println(book.gettitle() + &quot &quot + book.getauthor()); } //Read specific data RealmResults<Book> results = DBname.where(Book.class).equalTo(&quotid&quot, 1235).findAll(); به روز کردن داده ها:آپدیت کردن و به روز کردن داده ها در realm:RealmResults<‌Book> results = DBname.where(Book.class).equalTo(&quotid&quot, 20).findAll(); DBname.beginTransaction(); for(Book book : results){ Book.settitle(&quotnew Realm book&quot); } 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();فقط یک نکته باقی مونده اگر دقت کرده باشید اعمال تغییرات رو دیتا بیس مستلزم استفاده از دو عبارت .beginTransaction() و .commitTransaction() هست در آخر هم باید بگم realm قابلیت های جذاب زیادی داره که میشه ازش استفاده کرد تا بهترین نتیجه رو بتونیم بگیریم علاوه بر اون سرویس کلود برای اپلیکیشن ارائه میده که البته ما جز دور افتاده از بقیه دنیا محسوب میشیم :)امیدوارم مفید بوده باشه توضیحات و قطعا درصورت انتقاد و یادآوری مشکلاتی که احیانا از چشم من دور مونده بنده رو شاد میکنیدمنابع:وبسایت برنامه نویس دیوانهوبسایت اصلی Realmداکیومنت اصلی realmآموزش در androidHiveآپدیت: یکی از بزرگترین مشکلات من در استفاده از realm بالابردن حجم برنامه به شکل قابل توجهی (حدود 5 مگابایت) بود که باعث شد طی یک عملیات سریع برم سمت RoomDB که هم سرعت خوبی داره هم ساده و سبک هست