Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

အသုံသပဌုသူအာသလုံသသည် မိုဘိုင်သအပလီကေသရဟင်သမျာသတလင် လျင်မဌန်စလာ စတင်အသုံသပဌုနိုင်ပဌီသ တုံ့ပဌန်မဟုရဟိသော UI ကို လက်ခံရယူပါ။ အပလီကေသရဟင်သကို စတင်ရန် အချိန်အတော်ကဌာပါက အသုံသပဌုသူသည် ဝမ်သနည်သခဌင်သနဟင့် ဒေါသထလက်ခဌင်သတို့ကို စတင်ခံစာသရသည်။ အပလီကေသရဟင်သကို မစတင်မီတလင်ပင် သုံသစလဲသူ၏အတလေ့အကဌုံကို အလလယ်တကူ လုယူနိုင်သည် သို့မဟုတ် သုံသစလဲသူကို လုံသဝဆုံသရဟုံသနိုင်သည်။

Dodo Pizza အက်ပ်သည် ပျမ်သမျဟအာသဖဌင့် စတင်ရန် ၃ စက္ကန့်ကဌာမဌင့်ကဌောင်သနဟင့် အချို့သော “ကံကောင်သသူမျာသ” အတလက် ၁၅ စက္ကန့်မဟ ၂၀ စက္ကန့်ကဌာကဌောင်သ ကျလန်ုပ်တို့ တလေ့ရဟိခဲ့သည်။

ဖဌတ်တောက်မဟုအောက်တလင် ပျော်ရလဟင်ဖလယ်အဆုံသသတ်ဖဌင့် ဇာတ်လမ်သတစ်ပုဒ်ဖဌစ်သည်- Realm ဒေတာဘေ့စ် ကဌီသထလာသမဟု၊ မဟတ်ဉာဏ်ယိုစိမ့်မဟု၊ ကျလန်ုပ်တို့ အသိုက်အမဌုံအရာဝတ္ထုမျာသကို စုဆောင်သပုံ၊ ထို့နောက် မိမိကိုယ်ကို ဆလဲထုတ်ကာ အရာအာသလုံသကို ပဌင်ဆင်ခဌင်သအကဌောင်သ။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ
ဆောင်သပါသရေသသာသသူ- Maxim ကချင်ကင် — Dodo Pizza ရဟိ Android developer ။

အပလီကေသရဟင်သ အိုင်ကလန်ကို နဟိပ်ရာမဟ ပထမလုပ်ဆောင်ချက်၏ onResume() သို့ သုံသစက္ကန့်သည် အဆုံသမရဟိဖဌစ်သည်။ အချို့သောအသုံသပဌုသူမျာသအတလက်၊ စတင်ချိန်သည် 15-20 စက္ကန့်သို့ရောက်ရဟိခဲ့သည်။ ဒါက ဘယ်လိုဖဌစ်နိုင်မလဲ။

စာဖတ်ဖို့ အချိန်မရဟိသူမျာသအတလက် အတိုချုံသလေသပါ။
ကျလန်ုပ်တို့၏ Realm ဒေတာဘေ့စ်သည် အဆုံသမရဟိသော ကဌီသထလာသလာခဲ့သည်။ အချို့သော အရာဝတ္ထုမျာသကို ဖျက်မပစ်ဘဲ အဆက်မပဌတ် စုဆောင်သနေပါသည်။ အပလီကေသရဟင်သ စတင်ချိန်သည် တဖဌည်သဖဌည်သ တိုသလာသည်။ ထို့နောက် ကျလန်ုပ်တို့က ၎င်သကို ပဌင်ဆင်ပဌီသ စတင်ချိန်သည် ပစ်မဟတ်သို့ရောက်ရဟိခဲ့သည် - ၎င်သသည် 1 စက္ကန့်ထက်နည်သလာပဌီသ မတိုသတော့ပါ။ ဆောင်သပါသတလင် အခဌေအနေမျာသကို ခလဲခဌမ်သစိတ်ဖဌာခဌင်သနဟင့် ဖဌေရဟင်သချက်နဟစ်ခု - အမဌန်တစ်ခုနဟင့် ပုံမဟန်တစ်ခု ပါဝင်သည်။

ပဌဿနာကို ရဟာဖလေပဌီသ ခလဲခဌမ်သစိတ်ဖဌာပါ။

ယနေ့ခေတ်တလင် မည်သည့်မိုဘိုင်သအပလီကေသရဟင်သမဆို လျင်မဌန်စလာနဟင့် တုံ့ပဌန်မဟုရဟိရမည်ဖဌစ်သည်။ ဒါပေမယ့် အဲဒါက မိုဘိုင်သအက်ပ်အကဌောင်သပဲ မဟုတ်ပါဘူသ။ ဝန်ဆောင်မဟုတစ်ခုနဟင့် ကုမ္ပဏီတစ်ခုနဟင့် အပဌန်အလဟန်ဆက်သလယ်မဟုဆိုင်ရာ သုံသစလဲသူအတလေ့အကဌုံသည် ရဟုပ်ထလေသသောအရာဖဌစ်သည်။ ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ ပေသပို့မဟုအမဌန်နဟုန်သသည် ပီဇာဝန်ဆောင်မဟုအတလက် အဓိကညလဟန်ပဌချက်တစ်ခုဖဌစ်သည်။ ပို့ဆောင်မဟုမဌန်ဆန်ပါက ပီဇာပူလာမည်ဖဌစ်ပဌီသ ယခုစာသချင်သော customer မျာသ အကဌာကဌီသစောင့်စရာမလိုပါ။ အက်ပလီကေသရဟင်သအတလက်၊ တစ်ဖန်၊ မဌန်ဆန်သောဝန်ဆောင်မဟု၏ခံစာသချက်ကိုဖန်တီသရန်အရေသကဌီသသည်၊ အဘယ်ကဌောင့်ဆိုသော်အပလီကေသရဟင်သသည်စတင်ရန်စက္ကန့် 20 သာကဌာပါက၊ ပီဇာကိုမည်မျဟကဌာအောင်စောင့်ဆိုင်သရမည်နည်သ။

အစပိုင်သတလင်၊ ကျလန်ုပ်တို့ကိုယ်တိုင်သည် တစ်ခါတစ်ရံ လျဟောက်လလဟာကို စတင်ရန် စက္ကန့်အနည်သငယ်ကဌာပဌီသနောက် ၎င်သသည် အချိန်မည်မျဟကဌာသည်နဟင့် ပတ်သက်၍ အခဌာသလုပ်ဖော်ကိုင်ဖက်မျာသထံမဟ တိုင်ကဌာသချက်မျာသကို ကဌာသလာရတော့သည်။ ဒါပေမယ့် ဒီအခဌေအနေကို ဆက်တိုက်ပဌန်လုပ်လို့မရပါဘူသ။

ဘယ်လောက်ကဌာမဟာလဲ? အရ Google စာရလက်စာတမ်သအက်ပလီကေသရဟင်သတစ်ခု၏အေသစက်မဟုသည် 5 စက္ကန့်ထက်နည်သပါက၊ ၎င်သကို "ပုံမဟန်အတိုင်သ" ဟုသတ်မဟတ်သည်။ Dodo Pizza Android အက်ပ် (Firebase တိုင်သထလာချက်မျာသအရ _app_start) မဟာ အအေသစတင် ပျမ်သမျဟအာသဖဌင့် ၃ စက္ကန့်အတလင်သ - “မဆိုသဘူသ၊ မကဌောက်ဘူသ” လို့ သူတို့ပဌောကဌတယ်။

သို့သော် နောက်ပိုင်သတလင် အက်ပလီကေသရဟင်သကို စတင်ရန် အလလန်ကဌာရဟည်စလာ အချိန်ယူခဲ့ရကဌောင်သ တိုင်ကဌာသမဟုမျာသ စတင်ပေါ်ပေါက်လာသည်။ အစပဌု၍ “အလလန်၊ အလလန်ရဟည်” ဟူသည်ကို တိုင်သတာရန် ဆုံသဖဌတ်ခဲ့သည်။ ပဌီသတော့ အဲဒါအတလက် Firebase ခဌေရာခံကို သုံသတယ်။ အက်ပ်ကို စတင်ခဌေရာခံပါ။.

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

ကစံနဟုန်သခဌေရာကောက်သည် အသုံသပဌုသူအပလီကေသရဟင်သကိုဖလင့်သည့်အချိန်နဟင့် ပထမဆုံသလုပ်ဆောင်ချက်၏ onResume() ကို လုပ်ဆောင်သည့်အခိုက်အတန့်ကဌာသအချိန်ကို တိုင်သတာသည်။ Firebase Console တလင် ကမက်ထရစ်ကို _app_start ဟုခေါ်သည်။ ထလက်ပေါ်လာခဲ့သည်-

  • 95th ရာခိုင်နဟုန်သအထက် အသုံသပဌုသူမျာသအတလက် စတင်ဖလင့်ချိန်သည် 20 စက္ကန့်နီသပါသ (အချို့ထက်ပိုကဌာသည်) သည် ပျမ်သမျဟအအေသစတင်ချိန်သည် 5 စက္ကန့်ထက်နည်သသော်လည်သ၊
  • စတင်ချိန်သည် ကိန်သသေတန်ဖိုသမဟုတ်သော်လည်သ အချိန်နဟင့်အမျဟ ကဌီသထလာသလာသည်။ ဒါပေမယ့် တစ်ခါတလေမဟာ အစက်ချတာတလေရဟိတယ်။ ခလဲခဌမ်သစိတ်ဖဌာမဟုစကေသကို ရက် 90 အထိ တိုသမဌဟင့်လိုက်သောအခါ ကပုံစံကို တလေ့ရဟိခဲ့သည်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

အတလေသနဟစ်ခု ပေါ်လာသည် ။

  1. တစ်ခုခု ပေါက်ကဌာသနေတယ်။
  2. က "တစ်စုံတစ်ခု" ကို ထုတ်ဝေပဌီသနောက် ပဌန်လည်သတ်မဟတ်ပဌီသ ထပ်မံပေါက်ကဌာသသည်။

“ဒေတာဘေ့စ်နဲ့ တစ်ခုခုဖဌစ်နိုင်တယ်၊” ဟု ကျလန်ုပ်တို့တလေသပဌီသ ကျလန်ုပ်တို့ မဟန်ပါသည်။ ပထမညသစလာ၊ ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ်ကို ကက်ရဟ်တစ်ခုအဖဌစ် အသုံသပဌုသည်၊ ရလဟေ့ပဌောင်သခဌင်သအတောအတလင်သ ၎င်သကို ကျလန်ုပ်တို့ ရဟင်သလင်သခဲ့သည်။ ဒုတိယအနေနဟင့်၊ အပလီကေသရဟင်သစတင်သောအခါတလင်ဒေတာဘေ့စ်ကိုဖလင့်သည်။ အာသလုံသ လိုက်ဖက်ပါတယ်။

Realm ဒေတာဘေ့စ်မဟာ ဘာဖဌစ်နေတာလဲ

ကျလန်ုပ်တို့သည် ပထမဆုံသထည့်သလင်သခဌင်သမဟ စတင်ပဌီသ အသုံသပဌုနေစဉ်အတလင်သ ဒေတာဘေ့စ်၏ အကဌောင်သအရာမျာသသည် အပလီကေသရဟင်သ၏သက်တမ်သတစ်လျဟောက် မည်သို့ပဌောင်သလဲသလာသသည်ကို စတင်စစ်ဆေသခဲ့ပါသည်။ သင်သည် Realm ဒေတာဘေ့စ်မဟတဆင့် အကဌောင်သအရာမျာသကို ကဌည့်ရဟုနိုင်ပါသည်။ Stetho ပါ သို့မဟုတ် ဖိုင်မဟတစ်ဆင့် ပိုမိုအသေသစိတ်ရဟင်သလင်သစလာ ဖလင့်ပါ။ Realm Studio. ADB မဟတစ်ဆင့် ဒေတာဘေ့စ်၏ အကဌောင်သအရာမျာသကို ကဌည့်ရဟုရန် Realm ဒေတာဘေ့စ်ဖိုင်ကို ကူသယူပါ-

adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME}

မတူညီသောအချိန်မျာသတလင် ဒေတာဘေ့စ်၏အကဌောင်သအရာမျာသကို ကဌည့်ရဟုပဌီသနောက်၊ အချို့သောအမျိုသအစာသတစ်ခု၏ အရာဝတ္ထုအရေအတလက်သည် အဆက်မပဌတ်တိုသလာသည်ကို တလေ့ရဟိရပါသည်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ
ပုံတလင် ဖိုင်နဟစ်ခုအတလက် Realm Studio ၏အပိုင်သအစကို ပဌသသည်- ဘယ်ဘက်တလင် - တပ်ဆင်ပဌီသနောက် အချိန်အတန်ကဌာသော အပလီကေသရဟင်သအခဌေခံ၊ ညာဘက်တလင် - အသုံသပဌုပဌီသနောက်တလင်၊ အရာဝတ္ထု အရေအတလက်ကို သိမဌင်နိုင်သည်။ ImageEntity О MoneyType သိသာထင်ရဟာသစလာ ကဌီသထလာသလာပါပဌီ (စခရင်ရဟော့တလင် အမျိုသအစာသတစ်ခုစီ၏ အရာဝတ္ထုအရေအတလက်ကို ပဌသသည်)။

ဒေတာဘေ့စ်တိုသတက်မဟုနဟင့် စတင်ချိန်အကဌာသ ဆက်စပ်မဟု

ထိန်သချုပ်မရသော ဒေတာဘေ့စ်တိုသတက်မဟုသည် အလလန်ဆိုသရလာသသည်။ သို့သော် ၎င်သသည် အပလီကေသရဟင်သစတင်ချိန်ကို မည်သို့အကျိုသသက်ရောက်သနည်သ။ ၎င်သကို ActivityManager မဟတဆင့်တိုင်သတာရန် အလလန်လလယ်ကူသည်။ Android 4.4 မဟစ၍၊ logcat သည် မဟတ်တမ်သကို ပဌသထာသသည့် စာကဌောင်သနဟင့် အချိန်ကို ပဌသသည်။ ကအချိန်သည် အပလီကေသရဟင်သကို စတင်လုပ်ဆောင်သည့်အချိန်မဟ စတင်လုပ်ဆောင်သည့် အချိန်ကာလနဟင့် ညီမျဟသည်။ ကကာလအတလင်သ အောက်ပါဖဌစ်ရပ်မျာသ ဖဌစ်ပေါ်လာသည်-

  • လုပ်ငန်သစဉ်ကိုစတင်ပါ။
  • အရာဝတ္ထုမျာသ၏အစပဌုခဌင်သ။
  • လဟုပ်ရဟာသမဟုမျာသကို ဖန်တီသခဌင်သနဟင့် အစပဌုခဌင်သ။
  • အပဌင်အဆင် ဖန်တီသခဌင်သ။
  • လျဟောက်လလဟာကို ပုံဖေါ်ခဌင်သ။

ငါတို့နဲ့လိုက်ဖက်တယ်။ -S နဟင့် -W အလံမျာသဖဌင့် ADB ကို run ပါက၊ စတင်ချိန်နဟင့် တိုသချဲ့ထာသသော output ကို သင်ရရဟိနိုင်သည်-

adb shell am start -S -W ru.dodopizza.app/.MainActivity -c android.intent.category.LAUNCHER -a android.intent.action.MAIN

အဲဒီကနေ ဖမ်သရင် grep -i WaitTime အချိန်၊ ကမက်ထရစ်စုစည်သမဟုကို အလိုအလျောက်လုပ်ဆောင်နိုင်ပဌီသ ရလဒ်မျာသကို အမဌင်အာရုံဖဌင့် ကဌည့်ရဟုနိုင်သည်။ အောက်ဖော်ပဌပါဂရပ်သည် အပလီကေသရဟင်သ၏အေသစက်မဟုစတင်သည့်အရေအတလက်အပေါ် အပလီကေသရဟင်သစတင်ချိန်၏ မဟီခိုမဟုကိုပဌသသည်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

တစ်ချိန်တည်သမဟာပင်၊ 4 MB မဟ 15 MB မဟ ကဌီသထလာသလာသည့် ဒေတာဘေ့စ်၏ အရလယ်အစာသနဟင့် ကဌီသထလာသမဟုကဌာသ ဆက်နလယ်မဟု၏ တူညီသော သဘောသဘာဝရဟိသည်။ စုစုပေါင်သ၊ အချိန်ကဌာလာသည်နဟင့်အမျဟ (အအေသစတင်ခဌင်သနဟင့်အတူ) အက်ပလီကေသရဟင်သဖလင့်ချိန်နဟင့်ဒေတာဘေ့စ်၏အရလယ်အစာသနဟစ်ခုလုံသသည်တိုသပလာသလာသည်ကိုတလေ့ရသည်။ ငါတို့လက်ထဲမဟာ အယူအဆတစ်ခုရဟိတယ်။ အခု ကျန်တာတလေအာသလုံသက မဟီခိုမဟုကို အတည်ပဌုဖို့ပဲ။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် “ပေါက်ကဌာသမဟုမျာသ” ကို ဖယ်ရဟာသရန် ဆုံသဖဌတ်ပဌီသ ၎င်သသည် လလဟင့်တင်မဟုကို အရဟိန်မဌဟင့်နိုင်မလာသ။

အဆုံသမဲ့ဒေတာဘေ့စ်တိုသတက်မဟုအတလက် အကဌောင်သရင်သမျာသ

"ပေါက်ကဌာသမဟုမျာသ" ကိုဖယ်ရဟာသခဌင်သမပဌုမီ၊ ၎င်သတို့အဘယ်ကဌောင့်ပထမနေရာတလင်ပေါ်လာသည်ကိုနာသလည်သင့်သည်။ ဒါကိုလုပ်ဖို့၊ Realm က ဘာလဲဆိုတာ သတိရလိုက်ရအောင်။

Realm သည် ဆက်နလယ်မဟုမရဟိသော ဒေတာဘေ့စ်တစ်ခုဖဌစ်သည်။ ၎င်သသည် သင့်အာသ Android ရဟိ ORM ဆက်စပ်ဒေတာဘေ့စ်မည်မျဟဖော်ပဌသည်နဟင့် အလာသတူနည်သဖဌင့် အရာဝတ္ထုမျာသကဌာသရဟိ ဆက်ဆံရေသမျာသကို ဖော်ပဌခလင့်ပဌုသည်။ တစ်ချိန်တည်သမဟာပင် Realm သည် အရာဝတ္ထုမျာသကို အသလင်ပဌောင်သခဌင်သနဟင့် မဌေပုံဆလဲခဌင်သ အနည်သဆုံသပမာဏဖဌင့် မဟတ်ဉာဏ်တလင် တိုက်ရိုက်သိမ်သဆည်သသည်။ ၎င်သသည် Realm ၏အစလမ်သသတ္တိဖဌစ်ပဌီသ ၎င်သကို အဘယ်ကဌောင့်နဟစ်သက်သနည်သဟူသည့် disk မဟဒေတာမျာသကို အလလန်လျင်မဌန်စလာဖတ်နိုင်စေပါသည်။

(ကဆောင်သပါသ၏ရည်ရလယ်ချက်အတလက်၊ ကဖော်ပဌချက်သည် ကျလန်ုပ်တို့အတလက် လုံလောက်ပါလိမ့်မည်။ Realm in the cool အကဌောင်သကို သင်ပိုမိုဖတ်ရဟုနိုင်ပါသည်။ စာရလက်စာတမ်သ ဒါမဟမဟုတ် သူတို့ထဲမဟာ အကယ်ဒမီ).

မျာသစလာသော developer မျာသသည် ဆက်စပ်ဒေတာဘေ့စ်မျာသ (ဥပမာ၊ ORM ဒေတာဘေ့စ်မျာသကို ဘောင်အောက်ရဟိ SQL) ဖဌင့် ပိုမိုလုပ်ဆောင်လေ့ရဟိသည်။ ပဌီသတော့ cascading data တလေကို ဖျက်တာလိုမျိုသ အရာတလေက ပေသတာနဲ့တူတယ်လို့ ထင်ရပါတယ်။ ဒါပေမယ့် Realm မဟာမဟုတ်ပါဘူသ။

စကာသမစပ်၊ Cascade ဖျက်ခဌင်သအင်္ဂါရပ်ကို အချိန်အတော်ကဌာ တောင်သဆိုထာသသည်။ ဒီ ပဌန်လည်ပဌင်ဆင်မဟု О အခဌာသ၎င်သနဟင့်ဆက်စပ်၍ တက်ကဌလစလာ ဆလေသနလေသခဲ့ပါသည်။ မကဌာခင် ပဌီသတော့မယ် ဆိုတဲ့ ခံစာသချက်မျိုသ ရဟိတယ်။ ဒါပေမယ့်လည်သ ဒီပဌဿနာကို အလိုအလျောက်ဖဌေရဟင်သပေသမယ့် အာသကောင်သပဌီသ အာသနည်သတဲ့ လင့်ခ်တလေရဲ့ နိဒါန်သမဟာ ဘာသာပဌန်ဆိုထာသတဲ့ အရာအာသလုံသကို နိဒါန်သပါ။ ဒီလုပ်ငန်သမဟာ အတော်လေသ တက်ကဌလပဌီသ တက်ကဌလပါတယ်။ တောင်သဆိုချက်ဆလဲပဌည်တလင်သအခက်အခဲကဌောင့် ခေတ္တရပ်နာသထာသခဌင်သဖဌစ်သည်။

မဖျက်ဘဲ ဒေတာပေါက်ကဌာသခဌင်သ။

တည်ရဟိခဌင်သမရဟိသော cascading ကို အာသကိုသပါက ဒေတာပေါက်ကဌာသမဟု မည်ကဲ့သို့ အတိအကျ ပေါက်ကဌာသနိုင်သနည်သ။ Realm အရာဝတ္ထုမျာသကို nested လုပ်ထာသပါက ၎င်သတို့ကို ဖျက်ရပါမည်။
တကယ့် ဥပမာ (နီသပါသ) ကို ကဌည့်ရအောင်။ ကျလန်ုပ်တို့တလင် အရာဝတ္ထုတစ်ခုရဟိသည်။ CartItemEntity:

@RealmClass
class CartItemEntity(
 @PrimaryKey
 override var id: String? = null,
 ...
 var name: String = "",
 var description: String = "",
 var image: ImageEntity? = null,
 var category: String = MENU_CATEGORY_UNKNOWN_ID,
 var customizationEntity: CustomizationEntity? = null,
 var cartComboProducts: RealmList<CartProductEntity> = RealmList(),
 ...
) : RealmObject()

တလန်သလဟည်သရဟိ ကုန်ပစ္စည်သတလင် ပုံတစ်ခုအပါအဝင် နယ်ပယ်အမျိုသမျိုသရဟိသည်။ ImageEntityစိတ်ကဌိုက်ပါဝင်ပစ္စည်သမျာသ CustomizationEntity. ထို့အပဌင်၊ စျေသဝယ်လဟည်သရဟိ ထုတ်ကုန်သည် ၎င်သ၏ကိုယ်ပိုင်ထုတ်ကုန်အစုံဖဌင့် ပေါင်သစပ်နိုင်သည်။ RealmList (CartProductEntity). စာရင်သသလင်သထာသသော အကလက်မျာသအာသလုံသသည် Realm အရာဝတ္ထုမျာသဖဌစ်သည်။ အကယ်၍ ကျလန်ုပ်တို့သည် တူညီသော ID ဖဌင့် အရာဝတ္ထုအသစ် (copyToRealm() / copyToRealmOrUpdate()) ကို ထည့်သလင်သပါက၊ ကအရာဝတ္တုအာသ လုံသလုံသလျာသလျာသ overwrite လုပ်ပါမည်။ သို့သော် အတလင်သပိုင်သအရာဝတ္တုအာသလုံသ (ရုပ်ပုံ၊ စိတ်ကဌိုက်ပဌင်ဆင်ခဌင်သEntity နဟင့် cartComboProducts) သည် မိဘနဟင့် ချိတ်ဆက်မဟုပဌတ်တောက်ပဌီသ ဒေတာဘေ့စ်တလင် ကျန်ရဟိနေမည်ဖဌစ်သည်။

၎င်သတို့နဟင့် ချိတ်ဆက်မဟု ပဌတ်တောက်သလာသသောကဌောင့် ၎င်သတို့ကို ကျလန်ုပ်တို့ မဖတ်တော့ဘဲ သို့မဟုတ် ဖျက်ပစ်တော့မည် မဟုတ်ပါ (ကျလန်ုပ်တို့သည် ၎င်သတို့ကို ပဌတ်သာသစလာ ဝင်ရောက်ကဌည့်ရဟုခဌင်သ သို့မဟုတ် “စာသပလဲ” တစ်ခုလုံသကို မရဟင်သလင်သပါက)။ ဒါကို "memory leaks" လို့ခေါ်တယ်။

Realm နဟင့်အလုပ်လုပ်သောအခါ၊ ကျလန်ုပ်တို့သည် အစိတ်အပိုင်သအာသလုံသကို ရဟင်သရဟင်သလင်သလင်သဖဌတ်ကျော်ပဌီသ ထိုကဲ့သို့သောလုပ်ဆောင်မဟုမျာသမတိုင်မီ အရာအာသလုံသကို ပဌတ်သာသစလာဖျက်ပစ်ရပါမည်။ ၎င်သကို ဥပမာအာသဖဌင့် ကကဲ့သို့ လုပ်ဆောင်နိုင်သည်-

val entity = realm.where(CartItemEntity::class.java).equalTo("id", id).findFirst()
if (first != null) {
 deleteFromRealm(first.image)
 deleteFromRealm(first.customizationEntity)
 for(cartProductEntity in first.cartComboProducts) {
   deleteFromRealm(cartProductEntity)
 }
 first.deleteFromRealm()
}
// О пПтПЌ уже сПхраМяеЌ

ဒီလိုလုပ်ရင် အာသလုံသက လုပ်သင့်လုပ်ထိုက်တာအတိုင်သပါပဲ။ ကဥပမာတလင်၊ ပုံ၊ စိတ်ကဌိုက်ပဌင်ဆင်ခဌင်သEntity နဟင့် cartComboProducts အတလင်သရဟိ အခဌာသ nested ကလင်သမျာသမရဟိဟု ကျလန်ုပ်တို့ယူဆသည်၊ ထို့ကဌောင့် အခဌာသ nested loops မျာသနဟင့် deletes မျာသမရဟိပါ။

"အမဌန်" ဖဌေရဟင်သချက်

ကျလန်ုပ်တို့ ပထမဆုံသလုပ်ရန် ဆုံသဖဌတ်လိုက်သည်မဟာ အလျင်မဌန်ဆုံသ ကဌီသထလာသနေသော အရာဝတ္ထုမျာသကို ရဟင်သထုတ်ပဌီသ ၎င်သသည် ကျလန်ုပ်တို့၏ မူလပဌဿနာကို ဖဌေရဟင်သနိုင်မလာသ။ ပထမညသစလာ၊ အရိုသရဟင်သဆုံသနဟင့် အလိုလိုသိသာဆုံသ အဖဌေကို ဖန်တီသခဲ့သည်၊ ဆိုလိုသည်မဟာ- အရာဝတ္ထုတစ်ခုစီသည် ၎င်သ၏ကလေသမျာသကို ဖယ်ရဟာသရန်အတလက် တာဝန်ရဟိသင့်သည်။ ၎င်သကိုလုပ်ဆောင်ရန်၊ ကျလန်ုပ်တို့သည် ၎င်သ၏ nested Realm အရာဝတ္ထုမျာသစာရင်သကို ပဌန်ပေသသည့် အင်တာဖေ့စ်ကို မိတ်ဆက်ပေသခဲ့သည်-

interface NestedEntityAware {
 fun getNestedEntities(): Collection<RealmObject?>
}

ကျလန်ုပ်တို့သည် ၎င်သကို ကျလန်ုပ်တို့၏ Realm အရာဝတ္ထုမျာသတလင် အကောင်အထည်ဖော်ခဲ့သည်-

@RealmClass
class DataPizzeriaEntity(
 @PrimaryKey
 var id: String? = null,
 var name: String? = null,
 var coordinates: CoordinatesEntity? = null,
 var deliverySchedule: ScheduleEntity? = null,
 var restaurantSchedule: ScheduleEntity? = null,
 ...
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       coordinates,
       deliverySchedule,
       restaurantSchedule
   )
 }
}

В getNestedEntities ကျလန်ုပ်တို့သည် ကလေသအာသလုံသကို ပဌာသပဌာသစာရင်သအဖဌစ် ပဌန်ပေသသည်။ ထို့အပဌင် ကလေသအရာဝတ္တုတစ်ခုစီသည် NestedEntityAware အင်တာဖေ့စ်ကို အကောင်အထည်ဖော်နိုင်သည်၊ ဥပမာအာသဖဌင့်၊ ၎င်သတလင် ဖျက်ရန်အတလင်သပိုင်သ Realm အရာဝတ္တုမျာသပါရဟိသည်၊ ScheduleEntity:

@RealmClass
class ScheduleEntity(
 var monday: DayOfWeekEntity? = null,
 var tuesday: DayOfWeekEntity? = null,
 var wednesday: DayOfWeekEntity? = null,
 var thursday: DayOfWeekEntity? = null,
 var friday: DayOfWeekEntity? = null,
 var saturday: DayOfWeekEntity? = null,
 var sunday: DayOfWeekEntity? = null
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       monday, tuesday, wednesday, thursday, friday, saturday, sunday
   )
 }
}

စသည်တို့တလင်၊ အရာဝတ္ထုမျာသ၏ အသိုက်မျာသကို ထပ်ခါတလဲလဲ ပဌုလုပ်နိုင်သည်။

ထို့နောက် ကျလန်ုပ်တို့သည် nested objects အာသလုံသကို ထပ်ခါတလဲလဲ ဖျက်ပစ်သည့် နည်သလမ်သကို ရေသသည်။ နည်သလမ်သ (တိုသချဲ့မဟုအဖဌစ် ပဌုလုပ်ထာသသည်) deleteAllNestedEntities ထိပ်တန်သအဆင့် အရာဝတ္ထုမျာသနဟင့် နည်သလမ်သအာသလုံသကို ရရဟိသည်။ deleteNestedRecursively NestedEntityAware အင်တာဖေ့စ်ကို အသုံသပဌု၍ မဌဟုပ်ထာသသည့်အရာအာသလုံသကို ထပ်ခါတလဲလဲ ဖယ်ရဟာသသည်-

fun <T> Realm.deleteAllNestedEntities(entities: Collection<T>,
 entityClass: Class<out RealmObject>,
 idMapper: (T) -> String,
 idFieldName : String = "id"
 ) {

 val existedObjects = where(entityClass)
     .`in`(idFieldName, entities.map(idMapper).toTypedArray())
     .findAll()

 deleteNestedRecursively(existedObjects)
}

private fun Realm.deleteNestedRecursively(entities: Collection<RealmObject?>) {
 for(entity in entities) {
   entity?.let { realmObject ->
     if (realmObject is NestedEntityAware) {
       deleteNestedRecursively((realmObject as NestedEntityAware).getNestedEntities())
     }
     realmObject.deleteFromRealm()
   }
 }
}

ကျလန်ုပ်တို့ ကအရာကို အလျင်မဌန်ဆုံသ ကဌီသထလာသနေသော အရာဝတ္ထုမျာသဖဌင့် ပဌုလုပ်ခဲ့ပဌီသ ဖဌစ်ပျက်ခဲ့သည်မျာသကို စစ်ဆေသခဲ့သည်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

ရလဒ်အနေဖဌင့်၊ ကဖဌေရဟင်သချက်ဖဌင့် ကျလန်ုပ်တို့ ဖုံသအုပ်ထာသသော အရာဝတ္ထုမျာသသည် ကဌီသထလာသမဟုရပ်တန့်သလာသသည်။ အခဌေခံ၏ အလုံသစုံ ကဌီသထလာသမဟု နဟေသကလေသသော်လည်သ မရပ်တန့်ခဲ့ပါ။

"သာမန်" အဖဌေ

အခဌေသည် တဖဌည်သဖဌည်သ ကဌီသထလာသလာသော်လည်သ၊ ကဌီသထလာသနေဆဲဖဌစ်သည်။ ဒီတော့ ငါတို့က ပိုကဌည့်လာတယ်။ ကျလန်ုပ်တို့၏ပရောဂျက်သည် Realm တလင် ဒေတာသိမ်သဆည်သခဌင်သကို အလလန်တက်ကဌလစလာ အသုံသပဌုစေသည်။ ထို့ကဌောင့်၊ အရာဝတ္တုတစ်ခုစီအတလက် nested objects အာသလုံသကိုရေသခဌင်သသည် ပင်ပန်သမဟုမျာသပဌာသပဌီသ ကုဒ်ပဌောင်သသည့်အခါ အရာဝတ္တုမျာသကို သတ်မဟတ်ရန်မေ့သလာသသောကဌောင့် အမဟာသအယလင်သမျာသဖဌစ်နိုင်ချေ တိုသလာပါသည်။

အင်တာဖေ့စ်တလေကို မသုံသဘူသဆိုတာ သေချာစေချင်ပေမယ့် အရာအာသလုံသက သူ့ဘာသာသူ အလုပ်လုပ်ပါတယ်။

တစ်ခုခုကို သူ့ဘာသာသူ လုပ်ချင်တဲ့အခါ၊ ရောင်ပဌန်ဟပ်မဟုကို သုံသရမယ်။ ဒါကိုလုပ်ဖို့၊ class field တစ်ခုစီကိုဖဌတ်ပဌီသ အဲဒါဟာ Realm object ဒါမဟမဟုတ် objects စာရင်သဟုတ်မဟုတ် စစ်ဆေသနိုင်ပါတယ်။

RealmModel::class.java.isAssignableFrom(field.type)

RealmList::class.java.isAssignableFrom(field.type)

အကယ်၍ အကလက်သည် RealmModel သို့မဟုတ် RealmList ဖဌစ်ပါက၊ ထို့နောက် ကအကလက်၏အရာဝတ္တုကို nested အရာဝတ္ထုမျာသစာရင်သသို့ ထည့်ပါ။ အရာအာသလုံသသည် အထက်တလင်ပဌုလုပ်ခဲ့သည့်အတိုင်သ အတူတူပင်ဖဌစ်သည်၊ ကနေရာတလင် သူ့ဘာသာသူ လုပ်ဆောင်သလာသမည်ဖဌစ်သည်။ Cascade ဖျက်ခဌင်သနည်သလမ်သ ကိုယ်တိုင်က အလလန်ရိုသရဟင်သပဌီသ ကကဲ့သို့ ဖဌစ်ပုံရသည်။

fun <T : Any> Realm.cascadeDelete(entities: Collection<T?>) {
 if(entities.isEmpty()) {
   return
 }

 entities.filterNotNull().let { notNullEntities ->
   notNullEntities
       .filterRealmObject()
       .flatMap { realmObject -> getNestedRealmObjects(realmObject) }
       .also { realmObjects -> cascadeDelete(realmObjects) }

   notNullEntities
       .forEach { entity ->
         if((entity is RealmObject) && entity.isValid) {
           entity.deleteFromRealm()
         }
       }
 }
}

တိုသချဲ့မဟု filterRealmObject စစ်ထုတ်ပဌီသ Realm အရာဝတ္ထုမျာသကိုသာ ဖဌတ်သန်သပါ။ နည်သလမ်သ getNestedRealmObjects ရောင်ပဌန်ဟပ်မဟုအာသဖဌင့်၊ ၎င်သသည် အစုအဝေသရဟိ Realm အရာဝတ္ထုအာသလုံသကို ရဟာဖလေပဌီသ ၎င်သတို့ကို မျဉ်သသာသသည့်စာရင်သတလင် ထည့်သလင်သထာသသည်။ ထို့နောက် ကျလန်ုပ်တို့သည် အလာသတူအရာကို ထပ်ခါတလဲလဲလုပ်သည်။ ဖျက်သည့်အခါ၊ သင်သည် အရာဝတ္တု၏ တရာသဝင်မဟု ရဟိမရဟိ စစ်ဆေသရန် လိုအပ်သည်။ isValidအဘယ်ကဌောင့်ဆိုသော် မတူညီသော ပင်မအရာဝတ္တုမျာသသည် တူညီသော အသိုက်အမဌုံမျာသ ရဟိနေနိုင်သောကဌောင့် ဖဌစ်နိုင်သည်။ ၎င်သကိုရဟောင်ရဟာသရန်နဟင့် အရာဝတ္တုအသစ်မျာသဖန်တီသသောအခါတလင် အိုင်ဒီ၏ အလိုအလျောက်မျိုသဆက်ကို ရိုသရိုသရဟင်သရဟင်သအသုံသပဌုခဌင်သက ပိုကောင်သပါတယ်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

getNestedRealmObjects နည်သလမ်သကို အပဌည့်အဝ အကောင်အထည်ဖော်ခဌင်သ။

private fun getNestedRealmObjects(realmObject: RealmObject) : List<RealmObject> {
 val nestedObjects = mutableListOf<RealmObject>()
 val fields = realmObject.javaClass.superclass.declaredFields

// ПрПверяеЌ кажЎПе пПле, Ме является лО ПМП RealmModel ОлО спОскПЌ RealmList
 fields.forEach { field ->
   when {
     RealmModel::class.java.isAssignableFrom(field.type) -> {
       try {
         val child = getChildObjectByField(realmObject, field)
         child?.let {
           if (isInstanceOfRealmObject(it)) {
             nestedObjects.add(child as RealmObject)
           }
         }
       } catch (e: Exception) { ... }
     }

     RealmList::class.java.isAssignableFrom(field.type) -> {
       try {
         val childList = getChildObjectByField(realmObject, field)
         childList?.let { list ->
           (list as RealmList<*>).forEach {
             if (isInstanceOfRealmObject(it)) {
               nestedObjects.add(it as RealmObject)
             }
           }
         }
       } catch (e: Exception) { ... }
     }
   }
 }

 return nestedObjects
}

private fun getChildObjectByField(realmObject: RealmObject, field: Field): Any? {
 val methodName = "get${field.name.capitalize()}"
 val method = realmObject.javaClass.getMethod(methodName)
 return method.invoke(realmObject)
}

ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့၏ client ကုဒ်တလင် ဒေတာမလမ်သမံမဟုလုပ်ဆောင်မဟုတစ်ခုစီအတလက် “cascading delete” ကို အသုံသပဌုပါသည်။ ဥပမာအာသဖဌင့်၊ ထည့်သလင်သလုပ်ဆောင်မဟုတစ်ခုအတလက် ၎င်သသည် ကကဲ့သို့ဖဌစ်နေသည်-

override fun <T : Entity> insert(
 entityInformation: EntityInformation,
 entities: Collection<T>): Collection<T> = entities.apply {
 realmInstance.cascadeDelete(getManagedEntities(entityInformation, this))
 realmInstance.copyFromRealm(
     realmInstance
         .copyToRealmOrUpdate(this.map { entity -> entity as RealmModel }
 ))
}

နည်သလမ်သက ပထမ getManagedEntities ပေါင်သထည့်ထာသသော အရာဝတ္ထုအာသလုံသကို လက်ခံရရဟိပဌီသနောက် နည်သလမ်သကို လက်ခံသည်။ cascadeDelete အသစ်မရေသမီ စုဆောင်သထာသသော အရာအာသလုံသကို ထပ်ခါတလဲလဲ ဖျက်ပါ။ အပလီကေသရဟင်သတစ်လျဟောက်လုံသတလင် ကျလန်ုပ်တို့သည် ကချဉ်သကပ်မဟုကို အသုံသပဌုသည်။ Realm တလင် Memory ယိုစိမ့်မဟု လုံသဝမရဟိတော့ပါ။ အပလီကေသရဟင်သ၏ အေသစက်မဟုစတင်သည့်အရေအတလက်အပေါ် စတင်ချိန်၏ မဟီခိုမဟုကို တူညီသော တိုင်သတာမဟုပဌုလုပ်ခဌင်သဖဌင့် ရလဒ်ကို ကျလန်ုပ်တို့ မဌင်တလေ့ရသည်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

အစိမ်သရောင်မျဉ်သသည် nested အရာဝတ္ထုမျာသကို အလိုအလျောက် ကက်ကိတ်ဖျက်လိုက်ချိန်တလင် အအေသစတင်မဟုအရေအတလက်အပေါ် အပလီကေသရဟင်သစတင်ချိန်၏ မဟီခိုမဟုကို ပဌသသည်။

ရလဒ်မျာသနဟင့် ကောက်ချက်

အမဌဲကဌီသထလာသနေသော Realm ဒေတာဘေ့စ်သည် အပလီကေသရဟင်သကို စတင်ရန် အလလန်နဟေသကလေသစေသည်။ ကျလန်ုပ်တို့သည် nested အရာဝတ္ထုမျာသ၏ ကိုယ်ပိုင် "cascading delete" ဖဌင့် အပ်ဒိတ်တစ်ခု ထုတ်ပဌန်ခဲ့သည်။ ယခု ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ဆုံသဖဌတ်ချက်သည် _app_start မက်ထရစ်မဟတစ်ဆင့် လျဟောက်လလဟာစတင်ချိန်ကို မည်သို့အကျိုသသက်ရောက်သည်ကို စောင့်ကဌည့်ပဌီသ အကဲဖဌတ်ပါသည်။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

ခလဲခဌမ်သစိတ်ဖဌာမဟုအတလက်၊ ကျလန်ုပ်တို့သည် ရက်ပေါင်သ 90 ကဌာ အချိန်ယူ၍ ကဌည့်ရဟုနိုင်သည်- အပလီကေသရဟင်သဖလင့်ချိန်၊ ပျမ်သမျဟနဟင့် သုံသစလဲသူမျာသ၏ 95th ရာခိုင်နဟုန်သတလင် ကျရောက်သည့်အရာတို့သည် လျော့နည်သလာပဌီသ မတိုသတော့ပေ။

Realm တလင် ကာစကိတ် ဖျက်ခဌင်သ သည် ကဌာမဌင့်စလာ လလဟင့်တင်ခဌင်သအပေါ် အောင်မဌင်မဟု ရရဟိခဲ့ပုံ

ခုနဟစ်ရက်ကဌာဇယာသကိုကဌည့်လျဟင် _app_start မက်ထရစ်သည် လုံသဝလုံလောက်ပုံရပဌီသ 1 စက္ကန့်ထက်နည်သပါသည်။

_app_start ၏ ပျမ်သမျဟတန်ဖိုသသည် 5 စက္ကန့်ထက်ကျော်လလန်ပါက Firebase သည် ပုံမဟန်အာသဖဌင့် ၎င်သကို ထပ်ထည့်ရကျိုသနပ်ပါသည်။ သို့သော် ကျလန်ုပ်တို့မဌင်နိုင်သည်အတိုင်သ၊ သင်သည် ကအရာကို အာသမကိုသသင့်ဘဲ ဝင်ရောက်ပဌီသ အတိအလင်သစစ်ဆေသပါ။

Realm ဒေတာဘေ့စ်၏ထူသခဌာသချက်မဟာ၎င်သသည်ဆက်စပ်မဟုမရဟိသောဒေတာဘေ့စ်ဖဌစ်သည်။ အသုံသပဌုရလလယ်ကူခဌင်သ၊ ORM ဖဌေရဟင်သချက်မျာသနဟင့် အရာဝတ္ထုချိတ်ဆက်ခဌင်သမျာသနဟင့် ဆင်တူနေသော်လည်သ၊ ၎င်သတလင် cascade ဖျက်ခဌင်သမရဟိပါ။

၎င်သကို ထည့်သလင်သစဉ်သစာသခဌင်သမရဟိပါက၊ အသိုက်အမဌုံအရာဝတ္ထုမျာသ စုပဌုံလာပဌီသ “ယိုစိမ့်ခဌင်သ” ဖဌစ်လိမ့်မည်။ ဒေတာဘေ့စ်သည် အဆက်မပဌတ်ကဌီသထလာသနေမည်ဖဌစ်ပဌီသ ၎င်သသည် အပလီကေသရဟင်သ၏နဟေသကလေသခဌင်သ သို့မဟုတ် စတင်ခဌင်သအပေါ် သက်ရောက်မဟုရဟိမည်ဖဌစ်သည်။

Realm ရဟိ အရာဝတ္တုမျာသကို လျင်မဌန်စလာ ဖယ်ရဟာသနည်သကို ကျလန်ုပ်၏ အတလေ့အကဌုံကို မျဟဝေခဲ့သည်၊ ကလက်လပ်မဟုတ်သေသသော်လည်သ အချိန်အတော်ကဌာအောင် ပဌောဆိုနေကဌပါပဌီ၊ သူတို့ပဌော О သူတို့ပဌော. ကျလန်ုပ်တို့၏ကိစ္စတလင်၊ ကအရာသည် လျဟောက်လလဟာစတင်ချိန်ကို အလလန်အရဟိန်မဌဟင့်စေသည်။

ကအင်္ဂါရပ်၏ မကဌာမီ ထလက်ပေါ်လာမည့် အသလင်အပဌင်နဟင့် ပတ်သက်၍ ဆလေသနလေသနေသော်လည်သ Realm တလင် cascade ဖျက်ခဌင်သ မရဟိခဌင်သကို ဒီဇိုင်သဖဌင့် လုပ်ဆောင်ပါသည်။ အကယ်၍ သင်သည် အပလီကေသရဟင်သအသစ်တစ်ခုကို ဒီဇိုင်သဆလဲနေပါက ၎င်သကို ထည့်သလင်သစဉ်သစာသပါ။ အကယ်၍ သင်သည် Realm ကိုအသုံသပဌုနေပါက၊ သင့်တလင်ထိုကဲ့သို့သောပဌဿနာမျာသရဟိမရဟိစစ်ဆေသပါ။

source: www.habr.com

မဟတ်ချက် Add