ٍ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 داره .

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

 

یک شروع سریع با 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/

 

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

 

5 سال پیش

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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