اول یه چیزی رو صادقانه بگم اونم اینکه اصلاً تاکنون از SQLite برای ذخیره‌سازی اطلاعات در اندروید استفاده نکردم (پس لازم نیست باهاش خدافظی کنم 😬) دلیل آن هم این بود که از اول دنبال یه روشی مثل Linq To SQL در دات‌نت بودم، که درگیر دستورات SQL نشوم، به صورت اتفاقی با Realm آشنا شدم، در یک کلام می‌شه گفت فوق‌العادست! ایده‌اش این است که شما درگیر دستورات SQL نشوید و مثل ORM ها به ازای هر جدول یک کلاس در نظر بگیرید، در این حالت اگر بخواهید رکوردی داخل آن جدول وارد کنید باید یک شئ از آن کلاس ایجاد کرده و بعد بهش بگویید که این شئ را داخل دیتابیس ذخیره کن، به همین سادگی ! در ادامه یک سری نکات راجع به استفاده از Realm در اندروید آورده شده است:

پیش‌نیاز استفاده از Realm

قدم اول: اضافه کردن پلاگین Gradle در فایل پروژه

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:{% render_version %}"
    }
}

به جای render_version همان وروژن 1.0 می‌شود که به تازگی منتشر شده است، استفاده از Realm باعث می‌شود برنامه‌ی اندروید شما حدود 800KB چاق‌تر بشود، که خیلی نگران‌ کننده نیست 😙

قدم دوم: در فایل build.gradle داخل دایرکتوری اپلیکیشن پلاگین Realm رو اضافه می‌کنیم

apply plugin: 'realm-android'

اضافه کردن یک رکورد در دیتابیس

public class Person extends RealmObject {
    @PrimaryKey
    private long id;
    private String name;

    public Person(long id, String name) {
        this.id = id;
        this.name = name;
    }

    // ... Generated getters and setters ...
}

// Create a RealmConfiguration that saves the Realm file in the app's "files" directory.
RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build();
Realm.setDefaultConfiguration(realmConfig);

// Get a Realm instance for this thread
Realm realm = Realm.getDefaultInstance();

// Persist your data in a transaction
realm.beginTransaction();
Person person = realm.createObject(Person.class);
person.setName("ahmad");
realm.commitTransaction();

کوئری گرفتن

می‌توانید همه جور کوئری روی اطلاعات داشته باشید، از اعمال ساده مثل AND یا SORT بگیر تا Aggregation مثل average

به عنوان مثال دستور زیر تمامی اشخاصی که بین ۱۳ تا ۲۰ سال سن دارند را از دیتابیس در قالب یک لیست می‌گیرد.

RealmResults<User> teenagers = realm.where(User.class).between("age", 13, 20).findAll();

برای اطلاعات بیشتر حتماً داکیونت آن را به دقت مطالعه فرمایید!

گوش به زنگ باشیم که چه زمانی اطلاعات در دیتابیس تغییر می‌کند!

شاید بتوان گفت بهترین قابلیت Realm این است که شما می‌توانید تغییرات اطلاعات را رصد کنید، فوق‌العادست، به عنوان مثال می‌توان برنامه را اینگونه پیاده سازی کرد که هنگام دریافت اطلاعات جدید از سوی سرور آن‌ها را داخل دیتابیس ذخیره شود و بعد چون تغییرات را دائماً در دیتابیس رصد می‌شود به صورت لحظه‌ای تغییرات مورد نظر در UI پدیدار می‌شود، در این شرایط در هنگام دریافت Notification دیگر لازم نیست اطلاعات آن را با تکنیک Broadcast Intent به تمامی activity‌ها ارسال کرد …! در کل نحوه‌ی Sync اطلاعات در اپلیکیشن خیلی ساده‌تر خواهد شد.

public class MyActivity extends Activity {
    private Realm realm;
    private RealmChangeListener realmListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      realm = Realm.getDefaultInstance();
      realmListener = new RealmChangeListener() {
        @Override
        public void onChange(Realm realm) {
            // ... do something with the updates (UI, etc.) ...
        }};
      realm.addChangeListener(realmListener);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Remove the listener.
        realm.removeChangeListener(realmListener);
        // Close the Realm instance.
        realm.close();
    }
}

انواع Transaction ها

اکثر توسعه‌دهندگان از جمله خود من درست داکیومنت مربوطه‌ را نمی‌خوانند و از Transaction مناسب استفاده نمی‌کنند، به عنوان مثال تصور کنید می‌خواهید اطلاعاتی که به صورت Async از سرور دریافت می‌کنید را ذخیره کنید، برای این کار حتماً باید از این Asynchronous Transactions استفاده کنید، اگر از این روش استفاده نکنید،‌ اپلیکیشن شما بعضی مواقع با خطا روبه‌رو خواهد شد.

realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                User user = bgRealm.createObject(User.class);
                user.setName("John");
                user.setEmail("[email protected]");
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                // Transaction was a success.
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                // Transaction failed and was automatically canceled.
            }
        });

سخن آخر

استفاده از Realm خیلی هیجان انگیزه، ولی باید به این نکته توجه داشته باشید که به صورت صحیح از آن استفاده کنید و حتماً تمامی داکیومنت آن را به دقت بخوانید (خیلی زیاد نیست، حدود یک ساعت وقت می‌گیرد)، از سال ۲۰۱۲ تاکنون افراد خیلی زیادی روی این پروژه‌ی متن‌باز فعالیت داشته‌اند، هم اکنون این پروژه برای پلتفرم‌های مختلف مثل ios و یا xamarin نیز توسعه یافته است، و جالب اینکه فایل دیتابیس تولید شده در تمامی پلتفرم‌ها یکسان می‌باشد! شرکت‌های بزرگی مثل توییتر از Realm استفاده می‌کنند، پس جای نگرانی نیست و می‌تواند تمامی نیازهای شما را برطرف نماید.

پ‌ن: تمامی نمونه کدها از داکیومنت اصلی آورده شده است.😗