خانه » آموزش برنامه نویسی اندروید » ٍRealm جایگزینی برای Sqlite

ٍRealm جایگزینی برای Sqlite

سلام

چند روز پیش توی یک گروه برنامه نویسی دوستان دیتابیس جدیدی رو معرفی کردن که میتونه جایگزین خوبی برای sqlite باشه .

Realm is a mobile database

این شعاری هست که توی وبسایتش ( https://realm.io/) نوشته شده ، realm یک دیتابیس برای موبایل است، این دیتابیس به زبان java . Swift و Objective-C پیاده سازی شده است و می تواند هم برای اندروید و هم برای IOS مورد استفاده قرار گیرد.

در این پست نمی خوام زیاد در مورد ویژگی های این دیتابیس صحبت کنم و می خوام خیلی سریع بریم سراغ کد و ازش استفاده کنیم .

قبل از شروع کمی در مورد ORM ها می خوام بگم ، اگر تا الان با sqlite کار می کردید و کلمه ORM برای شما نا شناخته هست پس خیلی کار سختی می کردید ، بزارید اینجوری بگم ، فکر کنید یک لیستی از اطلاعات داریم ، شامل نام و شماره تلفن ، خوب اگر بخوایم از sql استفاده کنیم ، باید دیتابیس رو create کنیم و زمان خوندن اطلاعات هر فیلد رو (شماره و نام ) رو دونه دونه بیرون بکشیم ، حالا اگر یکم بخوایم با کلاس تر برخورد کنیم ، از کلاس هم استفاده می کنیم 😀

منظورم اینه که یک کلاس می سازیم که ۲ تا فیلد شماره تلفن و نام رو دازه ، و زمان خوندن دیتا از دیتابیس دونه دونه دستی این هارو پر می کنیم:

public class Contanct{
     String name;
     int phoneNumber;
}

خیلی خوبه ولی حالا اگه بخوایم یک فیلد دیگه مثلا آدرس رو هم بهش اضافه کنیم چه اتفاقی می افته ؟!

– باید تمام کد هایی که برای ساخت جدول دیتابیس و خواندن اطلاعات از داخل دیتابیس و پر کردن اون هاست و …. رو تغییر بدیم و فیلد جدید رو اضافه کنیم ؟!!!!!! واقعا کار سختی هست .

تازه نمی خوام sql نوشتن رو هم زیر سوال ببرم که اونم خودش همچین کار ساده ای نیست مخصوصا دیباگ کردنش :/ 

 

ORM چیه ؟ 

یک سری لایبرری برای اندروید ساخته شده که تا امروز برخی شاید ازش استفاده می کردن از جمله ORM-Lite  , Active Android , Grean DA ,DBFlow که هر کدوم تغییرات اندکی باهم دارن و کارشون اینه که شمارو از نوشتن SQL راحت می کنه ، و مشکلی که در بالا گفتم رو حل می کنه .

یعنی شما برای اینکه بخواید یک جدول داشته باشید با ستون های نام ، شماره تلفن و آدرس ، فقط کافیه یک کلاس بسازید با فیلد هایی که می خواید شبیه کلاسی که در بالا نوشتم ، بقیه کار هارو خود لایبرری انجام میده ، حالا برای نوشتن SQL شما فقط با متدها سر و کار دارید .

خیلی مزیت های دیگه ای هم ORM ها دارند ، از جمله Relation ها (One to One , One to Many , Many to One) و یا Migration و…

 

خوب realm فقط یک ORM نیست ، با اینکه قابلیت های اونارو هم داره ولی از ابتدا یک دیتابیس هست که ادعا داره بازدهی بهتری هم نسبت به sql داره .

(زمانی که من دارم این مقاله رو می نویسم هنوز نسخه ۱ این دیتابیس منتشر نشده و نسخه 0.84.1 می باشد)

 

یک شروع سریع با Realm:

خوب حالا وقتشه یک مثال سریع بزنیم :

۱ – افزودن لایبرری به اندروید استدیو:

برای افزودن این لایبرری به فایل  build.gradle کد زیر رو اضافه کنید :

dependencies {
    compile 'io.realm:realm-android:0.84.1'
}

سپس gradle  رو sync کنید.

 

۲ – یک مدل بسازید (مدل به کلاسی می گیم که شامل فیلد های اطلاعات ماست )


public class Note extends RealmObject {
    @PrimaryKey
    private String id;
    private String note;

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

کلاس مدل شما باید RealmObject رو ارث بری (extendes) کند ، همچنین فیلد ها باید private باشند و از getter و setter استفاده شود مانند بالا، در اینجا ۲ فیلد id و Note داریم.

 

۳ – خوب تمومه ، حالا می خوایم به دیتابیسمون یک ردیف دیتا اضافه کنیم:

  private void addNote(String noteText) {
        Realm realm = Realm.getInstance(this);
        realm.beginTransaction();

        Note note = new Note();
        note.setId(UUID.randomUUID().toString());
        note.setNote(noteText);

        realm.copyToRealm(note);
        realm.commitTransaction();
    }

برای این کار من یک متد در اکتیویتی خودم ساختم به اسم addNote که یک متن میگیره و اون رو در دیتابیس ذخیره می کنه .

البته یک نکته ظریف در این کد وجود داره ، یکی از اون ها اینه که برای ID از UUID.randomeUUID() به این دلیل که قضد دارم هر متنی که به دیتابیس اضافه میشه یک id مختص به خودش رو داشته باشه و تکراری نباشه که توی نت بهترین روش رو استفاده از این متد نوشته بودن.

خوب همونطور که می بینید ابتدا یک رفرنس به Realm گرفتم سپس beginTransaction() رو صدا زدم ، وقتی که قصد تغییر (افزودن ، تغییر دادن ، حذف کردن) دیتا از دیتابیس رو داریم باید بین ۲ متد begin و commit قرار بگیره.

بعد از اون مدلی رو که قصد ذخیره در دیتابیس دارم ساختم و اطلاعاتی که می خوام ذخیره بشه رو داخل اون گذاشتم و بعد با copyToRealm ، این کلاس رو به دیتابیس اضافه کردم و در نهایت با commitTransaction کار رو تموم کردم.

 

۴ – حالا می خوام لیستی از Note هایی که داخل دیتابیس هست رو بگیرم :

 RealmResults<Note> notes = Realm.getInstance(this).where(Note.class).findAll();

خیلی ساده ، با کد بالا تمام Note های موجود رو برای من لیست می کنه (RealmResults از نوع AbstractList هست ، درواقع میتونه شبیه به ArrayList باهاش برخورد کرد و حتی مقادیر اون رو داخل ArrayList ریخت)

 

تموم شد !!!

امیدوارم از این مطلب استفاده برده باشید ، امکان داره در آینده آموزش های بیشتری رو در مورد این دیتابیس قراربدم ولی تا اون موقع شما میتونید از doc خود لایبرری استفاده کنید : https://realm.io/docs/java/latest/

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

13 دیدگاه

  1. سلام

    مطلبتون خیلی مفید بود

    موفق باشید

  2. سلام باتشکر از مطلب خوبتون

    حالا اگه ما بخوایم مثل sqlite

    از دیتابیس از پیش آماده شده استفاده کنیم چی؟

    راهی وجود داره؟

    • بله وجود داره

      البته بستگی داره دیتابیس آماده شما از چه نوع باشه ، اگه Sqllite باشه ، کمی مشکل هست ، چون realm کلا یه نوع دیتابیس دیگه هست ، واسه استفاده از دیتابیس sqllite قدیمی باید مثل قبل اون رو ابتدا کپی کرد ، و بعد باید یک بار کل دیتارو توی دیتابیس جدید realm ایمپورت کرد .

      اما اگر دیتابیس از پیش آماده شما هم از نوع realm باشه ، بله امکانش هست ، زیاد هم سخت نیست ، میتونید مثال زیر رو ببینید

      https://github.com/realm/realm-java/tree/master/examples/migrationExample

       

  3. سلام این کتابخونه حجمش ۵مگابایته .هیچ راهی نیست حجمشو کم کرد . موقعی که از پروژه اکسپورت گرفته میشه حدود ۴ یا ۵ مگابایت به حجم پروژه اضافه میشه .

    • بله درسته ، مشکل اصلیش همینه و این به دلیل وجود لایبرری های native برای cpu های مختلف هست و مشکل بزرگیه که نمیشه ازش به راحتی چشم پوشی کرد.

  4. خیلی عالی بود

    دستت درد نکنه 

    :))

  5. سلام من وقتی لایبرری رو توی برنامه میزنم ارور میده و گریدل سینک نمیشه. شما نمیدونین ارور واسه چیه؟

    • احتمالا به درستی گریدل رو تنظیم نکردید ، البته میتونه مشکل از تحریم باشه ، که برای سینک کردن لایبرری نیاز به فیلترشکن دارید.

  6. سلام خسته نباشید. میشه اموزش های بیشتری از این دیتابیس بذارید. چون واقعا docs خدو سایت realm سخته. اگه زحمتشو بکشید ممنونتون میشم

    • سلام
      راستش به دلیل حجم زیاد (حدود ۵ مگابایت) که این لایبرری به برنامه اضافه می کنه خیلی وقته که از realm استفاده نکردم به همین دلیل آموزش هاش رو هم ادامه ندادم

  7. سلام
    مرسی از مطلب خوبتون. اما یه مسئله اینکه اگه تو ایران سینکش بدلیل تحریم کار نکنه که عملا نمیشه ازش استفاده کرد. و این خودش خیلی مهمتر از مشکل ۵ مگ اضافه شدن به حجم فایل خروجیه. درسته؟؟

    • ایلیا عابدینی

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

      • نه منظورم من سینک اطلاعات بین کلاینت و سرور هستش. یکی از مزایای این سرویس این هستش شما نیازی به کد نویسی و هندل برای بروزرسانی اطلاعات مابین دستگاه گوشی و سرور نیستید. و این کار بصورت realtime انجام میشه. منظور من این سینک هستش

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا