ကျွန်တော် ဒီနေ့စရေးမယ့် Tutorial ကတော့ Android နဲ့ သက်ဆိုင်တဲ့ အပိုင်းပါ။ Advanced Level ဖြစ်ပါတယ်။ ခေါင်းစဉ်ကိုတော့ Android with Realm Mobile Platform လို့ အမည်ပေးထားပါတယ်။
Realm ဆိုတာ ဘာလဲ
Realm(https://realm.io/) လို့ ပြောလိုက်ရင် အပိုင်းနှစ်ပိုင်းရှိပါတယ်။
- Realm Mobile Platform နဲ့
- Realm Mobile Database ပါ။
ကျွန်တော် ဒီ Tutorial မှာတော့ Realm Mobile Platform ကိုပဲ အဓိက ပြောသွားမှာဆိုတော့ Realm Mobile Platform ဆိုတာ ဘာလဲဆိုတာပဲ အဓိက ပြောသွားပါမယ်။
Realm Mobile Platform ဆိုတာ Mobile မှာ အသုံးပြုနိုင်တဲ့ Database Platform တစ်ခု ဖြစ်ပါတယ်။ ပုံမှန် ကျွန်တော်တို့ သုံးနေကြ SQLite Database လို Realm မှာလဲ Realm Database ဆိုတာ ရှိပါတယ်။ SQLite ကို သုံးမယ်ဆိုရင် Platform အနေနဲ့ Java က အထောက်အပံ့ပေးပါတယ်။ အဲဒီ Platform ကို ကိုယ်တိုင် တည်ဆောက်နိုင်သလို အသင့်သုံးနိုင်တဲ့ Platform တွေလဲ ရှိပါတယ်။ (ဥပမာ - ActiveAndroid) Realm မှာတော့ Realm Database အပြင် Database Platform ပါ ပါပြီးသား ဖြစ်ပါတယ်။
Realm Database ဟာ SQLite Database နဲ့ မတူပါဘူး။ SQLite ဟာ Traditional Relational Database တစ်ခု ဖြစ်ပြီး Realm Database ကတော့ Object Database ဖြစ်ပါတယ်။ NoSQL Database လို့လဲ ပြောလို့ရပါတယ်။ ဒါပေမယ့် Realm မှာ Relational Database ပုံစံတွေ ဖြစ်တဲ့ Schema တွေကို သုံးလို့ရပါတယ်။ ပုံမှန် သမာရိုးကျ Relational Database တွေထက် ကျော်သွားတာကတော့ Schema ထဲမှာ Object တွေကို ပုံစံမျိုးစုံ သိမ်းလို့ရတာပါ။
Realm Database ဟာ တစ်ခုထက်ပိုတဲ့ Database တွေကို Mobile မှာ Local သုံးလို့ပဲ ဖြစ်ဖြစ် Server နဲ့ ချိတ်ဆက်ပြီး ဖြစ်ဖြစ် သုံးလို့ရပါတယ်။ (ဒီနေရာမှာ Realm အနေနဲ့ Realm Database Platform လဲ ရှိသေးတယ်ဆိုတာ သိဖို့လိုပါတယ်)
Realm နဲ့ ဘာတွေ သုံးလို့ရလဲ
Realm က ပုံမှန် SQLite Database လို ဘာမဆိုသုံးလို့ရပါတယ်။ အဲဒီအပြင် SQLite Database ထက်ပိုပြီး သုံးလို့ရပါတယ်။ ဒါပေမယ့် SQLite Database မှာလို မတူတဲ့ အချက်တစ်ခုက Auto Increment ID သုံးမရတာပါ။ အဲဒီအတွက်လဲ ကိုယ်ပိုင် Key တစ်ခု ဖန်တီးပြီး အလွယ်တကူ သုံးလို့ရပါတယ်။ Realm ရဲ့ အားသာချက်တစ်ခုကတော့ Realm Database + Realm Platform ကို အသေတွဲထားတာ ဖြစ်တဲ့အတွက် Version Upgrade တွေ ထွက်တဲ့အခါ မကိုက်တော့တဲ့ ပြဿနာတွေ ကြုံစရာ အကြောင်း မရှိတော့ပါဘူး။ ဒါပေမယ့် SQLite မှာလို Platform ရွေးချယ်စရာ အများကြီး မရှိတဲ့အတွက် အားနည်းချက်တစ်ခုလို့ မြင်ချင်လဲ မြင်နိုင်ပါတယ်။ (ကျွန်တော့်အတွက်ကတော့ အဲဒါကို အားနည်းချက်လို့ မမြင်ပါဘူး။ SQLite မှာတုန်းက Platform တွေ ဒုက္ခပေးလို့ စိတ်ညစ်ရပေါင်း များခဲ့ပါတယ်)
Realm Mobile Platform Installation
Realm Mobile Platform ကို အသုံးချနိုင်ဖို့ ကျွန်တော်တို့ အနေနဲ့ Android Studio မှာ Project တစ်ခု ဆောက်ထားဖို့ လိုပါမယ်။ ကျွန်တော်ကတော့ ကျွန်တော့် Project အမည်ကို Awesome Realm လို့ အမည်ပေးထားပါတယ်။ ကျွန်တော်တို့ Project ကို Android View နဲ့ ကြည့်မယ်ဆိုရင် Gradle နှစ်ခုတွေ့ရပါမယ်။ တစ်ခုက Project Level နဲ့ နောက်တစ်ခုက Module Level ပါ။
Project Level Gradle ထဲမှာ ဒီမှာ ပြထားတဲ့အတိုင်း သွားဖြည့်ပေးဖို့ လိုပါမယ်။ (အခု ကျွန်တော်သုံးနေတဲ့ အချိန်မှာ version 3.4.0 ဖြစ်တဲ့အတွက် အဲဒီအတိုင်း ထည့်တာပါ။ နောက်ပိုင်း Version အသစ်တွေ ထွက်လာနိုင်ပါတယ်)
အဲဒီလို ထည့်ပြီးရင်တော့ Module Level Gradle ထဲမှာ အောက်က အတိုင်း ထည့်သွင်းပေးဖို့ လိုအပ်ပါမယ်။
အဆင့်တိုင်း အဆင့်တိုင်းမှာ Gradle Sync ပေးဖို့ လိုအပ်မှာ ဖြစ်ပါတယ်။ Realm Dependency တွေ အားလုံးဟာ အွန်လိုင်းက တစ်ဆင့်ဆွဲချမှာ ဖြစ်တဲ့အတွက် အင်တာနက် ချိတ်ဆက်ထားဖို့ လိုအပ်ပါတယ်။ အဲဒီလို ထည့်ပြီးပြီ၊ Sync လဲ လုပ်ပြီးပြီဆိုရင်တော့ Realm Mobile Platform Installation ပြီးပြီလို့ ဆိုနိုင်ပါတယ်။
Realm ကို စတင် အသုံးပြုရန် ပြင်ဆင်ခြင်း
ပုံမှန်သမာရိုးကျ Realm ကို အသုံးပြုနိုင်ဖို့အတွက် Application Level မှာ Init လုပ်ပေးရပါမယ်။ ကျွန်တော်ကတော့ MainApplication ဆိုတဲ့ class ရဲ့ onCreate() မှာ လုပ်ပေးပါတယ်။ (ဒီနေရာမှာ တစ်ခု သတိထားဖို့ လိုအပ်တာက init ကို တစ်ကြိမ်သာ လုပ်ပေးဖို့လိုတယ် ဆိုတာပါပဲ။)
အဲဒီလို တစ်ကြိမ်လုပ်ပြီးပြီဆိုရင် ကိုယ်သုံးချင်တဲ့ Activity (or) Fragment ကတစ်ဆင့် အောက်ပါ နည်းအတိုင်း ခေါ်သုံးရုံပါပဲ။
အဲဒီလို Activity တစ်ခုက ဖြစ်ဖြစ် Fragment တစ်ခုက ဖြစ်ဖြစ် ခေါ်လိုက်ပြီဆိုတာနဲ့ Realm Database ကို တစ်ခါတည်း တည်ဆောက်သွားပါတယ်။ (ပထမ Realm.init() မှာတုန်းက ပြင်ဆင်တဲ့အဆင့်ပဲ ရှိပါသေးတယ်။ တကယ် Database မဆောက်သေးပါဘူး။) ကျွန်တော်တို့ GenyMotion ကို သုံးနေမယ်ဆိုရင် (ဒါမှမဟုတ်) Root ဖောက်ထားတဲ့ ဖုန်းကို သုံးနေမယ်ဆိုရင် Andriod Device Monitor ကတစ်ဆင့် Database ဆောက်သွားတာ ကြည့်လို့ရပါတယ်။
အဲဒီ default.realm ဆိုတဲ့ ဖိုင်ကို ကိုယ့် computer ထဲ Save ပြီး Realm Browser နဲ့ ကြည့်လို့ရပါတယ်။ ဒါပေမယ့် အဲဒီ Realm Browser က Mac မှာပဲ ရပါတယ်။
Mac ကိုင်တဲ့သူတွေ အနေနဲ့ Mac App Store ကနေ Realm Browser ဆိုပြီး ရှာလိုက်မယ်ဆိုရင် တွေ့ပါလိမ့်မယ်။ ကျွန်တော်ကတော့ ဒီနေရာမှာ အားလုံး အဆင်ပြေမယ့် နည်းလမ်းကို သုံးပြီး လုပ်ပြသွားပါမယ်။ အဲဒီအတွက် Stetho-Realm (https://github.com/uPhyca/stetho-realm) ဆိုတာကို သုံးဖို့ လိုအပ်ပါတယ်။
Integrations of Stetho-Realm into Android Project
Stetho-Realm ကို ကိုယ့် Project ထဲ ဘယ်လို ထည့်ရမယ်ဆိုတာ သူ့ရဲ့ github မှာလဲ တစ်ခါတည်း ပြည့်ပြည့်စုံစုံ ရေးထားပြီး ဖြစ်ပါတယ်။ အဲဒီအတွက် installation ပြုလုပ်ပုံတွေကို မပြောတော့ပါဘူး။ Installation ပြုလုပ်ပြီးပြီ ဆိုရင်တော့ MainApplication ရဲ့ onCreate() မှာ Stetho Realm ကို initialize လုပ်ပေးဖို့ လိုအပ်ပါမယ်။
ဒီနေရာမှာ တစ်ခု သတိထားဖို့ လိုတာက Stetho ကို Application Debug လုပ်နေတဲ့ အချိန်မှာပဲ သုံးသင့်ပါတယ်။ တကယ့် Production မှာ မထည့်သင့်ပါဘူး။ Stetho Realm ကို သုံးရတဲ့ ရည်ရွယ်ချက်ကိုက ကိုယ်ဆောက်လိုက်တဲ့ Database ကို ပြန်ကြည့်နိုင်ဖို့ပါ။ Development လုပ်နေစဉ်အတွင်းမှာပဲ လိုအပ်မှာ ဖြစ်ပါတယ်။ Production မှာတော့ မလိုအပ်ပါဘူး။ အဲဒီလို initialize လုပ်ပြီးပြီဆိုရင်တော့ ကျွန်တော်တို့ Chrome Browser မှာ chrome://inspect ဆိုပြီး ရိုက်ထည့်လိုက်တာနဲ့ အောက်မှာ ပြထားတဲ့အတိုင်း တွေ့ရပါလိမ့်မယ်။
ပထမတစ်ခုကတော့ Chrome မှာ ရိုက်ထည့်ရမယ့် ပုံစံပါ။ ဒုတိယတစ်ခုကတော့ ကိုယ်ရေးထားတဲ့ Android Project ရဲ့ အမည်ကို တွေ့ရပါလိမ့်မယ်။ ကျွန်တော်ကတော့ Awesome Realm လို့ ပေးထားတဲ့အတွက် Awesome Realm လို့ ပေါ်နေပါလိမ့်မယ်။
inspect ဆိုတာကို ကလစ်ခေါက်လိုက်မယ်ဆိုရင် အပေါ်မှာပြထားတဲ့ပုံအတိုင်း Developer Tools တက်လာပါလိမ့်မယ်။ အဲဒီ Developer Tools က Resources ဆိုတဲ့ Tab ကို ကလစ်ခေါက်မယ်ဆိုရင် Web SQL ဆိုတဲ့ Tree View ကို တွေ့ပါလိမ့်မယ်။ အဲဒါကို ကလစ်ခေါက်လိုက်တယ်ဆိုရင် default.realm ကို တွေ့ပါမယ်။ အဲဒါက ကျွန်တော်တို့ ဆောက်လိုက်တဲ့ Realm Database ပါပဲ။ Realm Browser တွေကို သုံးလို့ မရတဲ့သူတွေအတွက် Stetho Realm က အထောက်အပံ့ပေးပါလိမ့်မယ်။ Chrome Browser တော့ ရှိဖို့ လိုပါတယ်။
Models in Realm
Realm မှာ Model ဆိုတာ Table ဆောက်လိုက်တာလဲ ဖြစ်သလို အဲဒီ Model ကို ပြန်အသုံးချတဲ့ နေရာမှာလဲ သုံးပါတယ်။ ကျွန်တော်တို့ နမူနာ အနေနဲ့ Table သုံးခုလောက် ဆောက်လိုက်ရအောင်...
ကျွန်တော်တို့ဆီမှာ Category, Post, Author ဆိုတဲ့ Table သုံးခုပါတယ်ဆိုပါစို့။ Realm မှာ Model သုံးခု ဆောက်ဖို့ လိုအပ်ပါတယ်။ ကျွန်တော်ကတော့ Model အတွက် model ဆိုတဲ့ package တစ်ခု ခွဲထုတ်လိုက်ပါတယ်။ အဲဒီအထဲမှာ Category ဆိုတဲ့ class ရယ်၊ Author ဆိုတဲ့ class ရယ်၊ Post ဆိုတဲ့ class ရယ်၊ ဆောက်ဖို့ လိုပါတယ်။ Realm Model ကို တည်ဆောက်မှာ ဖြစ်တဲ့အတွက် RealmObject ကို extends လုပ်ပေးဖို့ လိုအပ်ပါတယ်။
အပေါ်မှာ ပြထားတာတော့ Category Class တည်ဆောက်တဲ့ ပုံစံပါ။ Getter & Setter တွေပါ တစ်ခါတည်း Generate ထုတ်လိုက်ပါတယ်။ Category Class ရဲ့ Source Code ကတော့ အောက်မှာပြထားတဲ့အတိုင်း ဖြစ်ပါတယ်။
package net.myanmarlinks.awesomerealm.model; | |
import io.realm.RealmObject; | |
/** | |
* Created by soethihanaung on 7/7/17. | |
*/ | |
public class Category extends RealmObject { | |
private long id; | |
private String name; | |
public long getId() { | |
return id; | |
} | |
public void setId(long id) { | |
this.id = id; | |
} | |
public String getName() { | |
return name; | |
} | |
public void setName(String name) { | |
this.name = name; | |
} | |
} |
Author ကလဲ အတူတူပါပဲ။
Post ကို ရေးတဲ့ နေရာမှာတော့ တစ်ခြား Table တွေနဲ့ Relation တွေ ရှိနေတဲ့အတွက် နည်းနည်း ထပ်ဖြည့်ဖို့ လိုပါမယ်။
package net.myanmarlinks.awesomerealm.model; | |
import io.realm.RealmObject; | |
/** | |
* Created by soethihanaung on 7/7/17. | |
*/ | |
public class Post extends RealmObject { | |
private long id; | |
private String title; | |
private Category category; | |
private Author author; | |
public long getId() { | |
return id; | |
} | |
public void setId(long id) { | |
this.id = id; | |
} | |
public String getTitle() { | |
return title; | |
} | |
public void setTitle(String title) { | |
this.title = title; | |
} | |
public Category getCategory() { | |
return category; | |
} | |
public void setCategory(Category category) { | |
this.category = category; | |
} | |
public Author getAuthor() { | |
return author; | |
} | |
public void setAuthor(Author author) { | |
this.author = author; | |
} | |
} |
အဓိက Post ကို ရေးတဲ့အခါမှာ Author တို့ Category တို့နဲ့ One-to-Many Relationship ရှိနေတဲ့အတွက် ကျွန်တော်တို့ ပုံမှန်ရေးနေကြ category_id တို့ author_id တို့ နေရာမှာ Category, Author class တွေကို သုံးပေးဖို့ လိုအပ်ပါတယ်။ အဲဒီလို class တွေ တည်ဆောက်ပြီး App ကို Run ကြည့်မယ်ဆိုရင် Chrome Browser က inspect မှာ အောက်မှာ ပြထားတဲ့အတိုင်း မြင်ရပါလိမ့်မယ်။ (ဒီနေရာမှာ တစ်ခုခု Error တက်လာတာ ဖြစ်နိုင်ပါတယ်။ အဲဒီလို ဖြစ်လာရင် App တစ်ခုလုံး Uninstall လုပ်ပြီးမှ ပြန် Run ပါ)
နိဂုံး
ကျွန်တော်တို့ Android with Realm Mobile Platform အပိုင်း (၁) ကို ဒီနေရာမှာ ရပ်လိုက်ရအောင်။ ဆက်လက်ပြီး Realm သုံးပြီး Data တွေ ဘယ်လို ထည့်တယ်၊ ဘယ်လို Query လုပ်တယ်၊ စတဲ့အပိုင်းတွေနဲ့ ရှေ့ဆက်သွားပါမယ်။ အဲ့ဒီအတွက် Tutorials တွေတင်တာနဲ့ ချက်ခြင်းသိရအောင် TechX က RSS Feed (https://techx.myanmarlinks.net/feed) ကို Feed Reader တစ်ခုခုမှာ Add ထားနိုင်ပါတယ်။ လက်တွေ့လုပ်ငန်းခွင်မှာ အသုံးချနိုင်ကြပါစေ ...
Join Us On