á¡áá¯á¶ážááŒá¯áá°á¡á¬ážáá¯á¶ážááẠááá¯ááá¯ááºážá¡ááá®áá±ážááŸááºážáá»á¬ážááœáẠáá»ááºááŒááºá áœá¬ á áááºá¡áá¯á¶ážááŒá¯ááá¯ááºááŒá®áž áá¯á¶á·ááŒááºááŸá¯ááŸááá±á¬ UI ááᯠáááºáá¶ááá°áá«á á¡ááá®áá±ážááŸááºážááᯠá áááºááẠá¡áá»áááºá¡áá±á¬áºááŒá¬áá«á á¡áá¯á¶ážááŒá¯áá°ááẠáááºážáááºážááŒááºážááŸáá·áº áá±á«áááœááºááŒááºážááá¯á·ááᯠá áááºáá¶á á¬ážááááºá á¡ááá®áá±ážááŸááºážááᯠáá áááºáá®ááœááºááẠáá¯á¶ážá áœá²áá°áá¡ááœá±á·á¡ááŒá¯á¶ááᯠá¡ááœááºááá° áá¯áá°ááá¯ááºááẠááá¯á·ááá¯áẠáá¯á¶ážá áœá²áá°ááᯠáá¯á¶ážááá¯á¶ážááŸá¯á¶ážááá¯ááºáááºá
Dodo Pizza á¡ááºááºááẠáá»ááºážáá»áŸá¡á¬ážááŒáá·áº á áááºááẠá á áá¹ááá·áºááŒá¬ááŒáá·áºááŒá±á¬ááºážááŸáá·áº á¡áá»áá¯á·áá±á¬ âáá¶áá±á¬ááºážáá°áá»á¬ážâ á¡ááœáẠáá á áá¹ááá·áºá០áá á áá¹ááá·áºááŒá¬ááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á· ááœá±á·ááŸááá²á·áááºá
ááŒááºáá±á¬ááºááŸá¯á¡á±á¬ááºááœáẠáá»á±á¬áºááœáŸááºááœááºá¡áá¯á¶ážáááºááŒáá·áº áá¬ááºáááºážáá áºáá¯ááºááŒá áºáááº- Realm áá±áá¬áá±á·á ẠááŒá®ážááœá¬ážááŸá¯á ááŸááºáá¬ááºááá¯á ááá·áºááŸá¯á áá»áœááºá¯ááºááá¯á· á¡ááá¯ááºá¡ááŒá¯á¶á¡áá¬ááá¹áá¯áá»á¬ážááᯠá á¯áá±á¬ááºážáá¯á¶á ááá¯á·áá±á¬áẠááááááá¯ááºááᯠááœá²áá¯ááºáᬠá¡áá¬á¡á¬ážáá¯á¶ážááᯠááŒááºáááºááŒááºážá¡ááŒá±á¬ááºážá
áá±á¬ááºážáá«ážáá±ážáá¬ážáá°-Maxim ááá»ááºááẠâ Dodo Pizza ááŸá Android developer á
á¡ááá®áá±ážááŸááºáž á¡áá¯ááºááœááºááᯠááŸáááºáá¬á០ááááá¯ááºáá±á¬ááºáá»ááºá onResume() ááá¯á· áá¯á¶ážá áá¹ááá·áºááẠá¡áá¯á¶ážáááŸáááŒá áºáááºá á¡áá»áá¯á·áá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœááºá á áááºáá»áááºááẠ15-20 á áá¹ááá·áºááá¯á·áá±á¬ááºááŸááá²á·áááºá áá«á áááºááá¯ááŒá áºááá¯ááºááá²á
á
á¬áááºááá¯á· á¡áá»áááºáááŸááá°áá»á¬ážá¡ááœáẠá¡ááá¯áá»á¯á¶ážáá±ážáá«á
áá»áœááºá¯ááºááá¯á·á Realm áá±áá¬áá±á·á
áºááẠá¡áá¯á¶ážáááŸááá±á¬ ááŒá®ážááœá¬ážáá¬áá²á·áááºá á¡áá»áá¯á·áá±á¬ á¡áá¬ááá¹áá¯áá»á¬ážááᯠáá»ááºááá
áºáá² á¡áááºáááŒáẠá
á¯áá±á¬ááºážáá±áá«áááºá á¡ááá®áá±ážááŸááºáž á
áááºáá»áááºááẠáááŒááºážááŒááºáž ááá¯ážáá¬áááºá ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·á áááºážááᯠááŒááºáááºááŒá®áž á
áááºáá»áááºááẠáá
áºááŸááºááá¯á·áá±á¬ááºááŸááá²á·ááẠ- áááºážááẠ1 á
áá¹ááá·áºáááºáááºážáá¬ááŒá®áž áááá¯ážáá±á¬á·áá«á áá±á¬ááºážáá«ážááœáẠá¡ááŒá±á¡áá±áá»á¬ážááᯠááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááŸáá·áº ááŒá±ááŸááºážáá»ááºááŸá
áºáᯠ- á¡ááŒááºáá
áºáá¯ááŸáá·áº áá¯á¶ááŸááºáá
áºáᯠáá«áááºáááºá
ááŒá¿áá¬ááᯠááŸá¬ááœá±ááŒá®áž ááœá²ááŒááºážá áááºááŒá¬áá«á
ááá±á·áá±ááºááœáẠáááºááá·áºááá¯ááá¯ááºážá¡ááá®áá±ážááŸááºážáááᯠáá»ááºááŒááºá áœá¬ááŸáá·áº áá¯á¶á·ááŒááºááŸá¯ááŸáááááºááŒá áºáááºá áá«áá±ááá·áº á¡á²áá«á ááá¯ááá¯ááºážá¡ááºááºá¡ááŒá±á¬ááºážáá² ááá¯ááºáá«áá°ážá áááºáá±á¬ááºááŸá¯áá áºáá¯ááŸáá·áº áá¯áá¹ááá®áá áºáá¯ááŸáá·áº á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááá¯ááºáᬠáá¯á¶ážá áœá²áá°á¡ááœá±á·á¡ááŒá¯á¶ááẠááŸá¯ááºááœá±ážáá±á¬á¡áá¬ááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá áá±ážááá¯á·ááŸá¯á¡ááŒááºááŸá¯ááºážááẠáá®áá¬áááºáá±á¬ááºááŸá¯á¡ááœáẠá¡áááááœáŸááºááŒáá»ááºáá áºáá¯ááŒá áºáááºá ááá¯á·áá±á¬ááºááŸá¯ááŒááºáááºáá«á áá®áá¬áá°áá¬áááºááŒá áºááŒá®áž ááá¯á á¬ážáá»ááºáá±á¬ customer áá»á¬áž á¡ááŒá¬ááŒá®ážá á±á¬áá·áºá áá¬áááá¯áá«á á¡ááºááá®áá±ážááŸááºážá¡ááœááºá áá áºáááºá ááŒááºáááºáá±á¬áááºáá±á¬ááºááŸá¯ááá¶á á¬ážáá»ááºááá¯áááºáá®ážáááºá¡áá±ážááŒá®ážáááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áºá¡ááá®áá±ážááŸááºážáááºá áááºáááºá áá¹ááá·áº 20 áá¬ááŒá¬áá«áá áá®áá¬ááá¯áááºáá»áŸááŒá¬á¡á±á¬ááºá á±á¬áá·áºááá¯ááºážááááºáááºážá
á¡á ááá¯ááºážááœááºá áá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯ááºááẠáá áºáá«áá áºáᶠáá»áŸá±á¬ááºááœáŸá¬ááᯠá áááºááẠá áá¹ááá·áºá¡áááºážáááºááŒá¬ááŒá®ážáá±á¬áẠáááºážááẠá¡áá»áááºáááºáá»áŸááŒá¬áááºááŸáá·áº áááºáááºá á¡ááŒá¬ážáá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážáá¶á០ááá¯ááºááŒá¬ážáá»ááºáá»á¬ážááᯠááŒá¬ážáá¬ááá±á¬á·áááºá áá«áá±ááá·áº áá®á¡ááŒá±á¡áá±ááᯠáááºááá¯ááºááŒááºáá¯ááºááá¯á·áááá«áá°ážá
áááºáá±á¬ááºááŒá¬ááŸá¬áá²? á¡á
ááá¯á·áá±á¬áº áá±á¬ááºááá¯ááºážááœáẠá¡ááºááá®áá±ážááŸááºážááᯠá
áááºááẠá¡ááœááºááŒá¬ááŸááºá
áœá¬ á¡áá»áááºáá°áá²á·áááŒá±á¬ááºáž ááá¯ááºááŒá¬ážááŸá¯áá»á¬áž á
áááºáá±á«áºáá±á«ááºáá¬áááºá á¡á
ááŒá¯á âá¡ááœááºá á¡ááœááºááŸááºâ áá°áááºááᯠááá¯ááºážáá¬ááẠáá¯á¶ážááŒááºáá²á·áááºá ááŒá®ážáá±á¬á· á¡á²áá«á¡ááœáẠFirebase ááŒá±áá¬áá¶ááᯠáá¯á¶ážáááºá
á€á
á¶ááŸá¯ááºážááŒá±áá¬áá±á¬ááºááẠá¡áá¯á¶ážááŒá¯áá°á¡ááá®áá±ážááŸááºážááá¯ááœáá·áºááá·áºá¡áá»áááºááŸáá·áº ááááá¯á¶ážáá¯ááºáá±á¬ááºáá»ááºá onResume() ááᯠáá¯ááºáá±á¬ááºááá·áºá¡ááá¯ááºá¡ááá·áºááŒá¬ážá¡áá»áááºááᯠááá¯ááºážáá¬áááºá Firebase Console ááœáẠá€áááºááá
áºááᯠ_app_start áá¯áá±á«áºáááºá ááœááºáá±á«áºáá¬áá²á·áááº-
- 95th áá¬ááá¯ááºááŸá¯ááºážá¡ááẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœáẠá áááºááœáá·áºáá»áááºááẠ20 á áá¹ááá·áºáá®ážáá«áž (á¡áá»áá¯á·áááºááá¯ááŒá¬áááº) ááẠáá»ááºážáá»áŸá¡á¡á±ážá áááºáá»áááºááẠ5 á áá¹ááá·áºáááºáááºážáá±á¬áºáááºážá
- á áááºáá»áááºááẠááááºážáá±áááºááá¯ážááá¯ááºáá±á¬áºáááºáž á¡áá»áááºááŸáá·áºá¡áá»áŸ ááŒá®ážááœá¬ážáá¬áááºá áá«áá±ááá·áº áá áºáá«ááá±ááŸá¬ á¡á ááºáá»áá¬ááœá±ááŸááááºá ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á áá±ážááᯠááẠ90 á¡áá ááá¯ážááŒáŸáá·áºááá¯ááºáá±á¬á¡áá« á€áá¯á¶á á¶ááᯠááœá±á·ááŸááá²á·áááºá
á¡ááœá±ážááŸá
áºáᯠáá±á«áºáá¬ááẠá
- áá áºáá¯áᯠáá±á«ááºááŒá¬ážáá±áááºá
- ဠ"áá áºá á¯á¶áá áºáá¯" ááᯠáá¯ááºáá±ááŒá®ážáá±á¬áẠááŒááºáááºáááºááŸááºááŒá®áž áááºáá¶áá±á«ááºááŒá¬ážáááºá
âáá±áá¬áá±á·á áºáá²á· áá áºáá¯áá¯ááŒá áºááá¯ááºáááºáâ áᯠáá»áœááºá¯ááºááá¯á·ááœá±ážááŒá®áž áá»áœááºá¯ááºááá¯á· ááŸááºáá«áááºá ááááŠážá áœá¬á áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬áá±á·á áºááᯠáááºááŸáºáá áºáá¯á¡ááŒá Ạá¡áá¯á¶ážááŒá¯áááºá ááœáŸá±á·ááŒá±á¬ááºážááŒááºážá¡áá±á¬á¡ááœááºáž áááºážááᯠáá»áœááºá¯ááºááá¯á· ááŸááºážáááºážáá²á·áááºá áá¯áááá¡áá±ááŸáá·áºá á¡ááá®áá±ážááŸááºážá áááºáá±á¬á¡áá«ááœááºáá±áá¬áá±á·á áºááá¯ááœáá·áºáááºá á¡á¬ážáá¯á¶áž ááá¯ááºáááºáá«áááºá
Realm áá±áá¬áá±á·á áºááŸá¬ áá¬ááŒá áºáá±áá¬áá²
áá»áœááºá¯ááºááá¯á·ááẠááááá¯á¶ážááá·áºááœááºážááŒááºážá០á
áááºááŒá®áž á¡áá¯á¶ážááŒá¯áá±á
ááºá¡ááœááºáž áá±áá¬áá±á·á
áºá á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááẠá¡ááá®áá±ážááŸááºážááááºáááºážáá
áºáá»áŸá±á¬áẠáááºááá¯á·ááŒá±á¬ááºážáá²ááœá¬ážáááºááᯠá
áááºá
á
áºáá±ážáá²á·áá«áááºá áááºááẠRealm áá±áá¬áá±á·á
áºááŸáááá·áº á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME}
ááá°áá®áá±á¬á¡áá»áááºáá»á¬ážááœáẠáá±áá¬áá±á·á áºáá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááŒáá·áºááŸá¯ááŒá®ážáá±á¬ááºá á¡áá»áá¯á·áá±á¬á¡áá»áá¯ážá¡á á¬ážáá áºáá¯á á¡áá¬ááá¹áá¯á¡áá±á¡ááœááºááẠá¡áááºáááŒááºááá¯ážáá¬áááºááᯠááœá±á·ááŸáááá«áááºá
áá¯á¶ááœáẠááá¯ááºááŸá
áºáá¯á¡ááœáẠ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
á¡áá»áááºá á€áááºááá
áºá
á¯á
ááºážááŸá¯ááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááá¯ááºááŒá®áž ááááºáá»á¬ážááᯠá¡ááŒááºá¡á¬áá¯á¶ááŒáá·áº ááŒáá·áºááŸá¯ááá¯ááºáááºá á¡á±á¬ááºáá±á¬áºááŒáá«ááááºááẠá¡ááá®áá±ážááŸááºážáá¡á±ážá
ááºááŸá¯á
áááºááá·áºá¡áá±á¡ááœááºá¡áá±á«áº á¡ááá®áá±ážááŸááºážá
áááºáá»áááºá ááŸá®ááá¯ááŸá¯ááá¯ááŒááááºá
áá
áºáá»áááºáááºážááŸá¬áááºá 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 ááœáẠáá±áá¬ááááºážáááºážááŒááºážááᯠá¡ááœááºáááºááŒáœá áœá¬ á¡áá¯á¶ážááŒá¯á á±áááºá ááá¯á·ááŒá±á¬áá·áºá á¡áá¬ááá¹áá¯áá áºáá¯á á®á¡ááœáẠ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
á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº ááá°áá®áá±á¬ áááºáá¡áá¬ááá¹áá¯áá»á¬ážááẠáá°áá®áá±á¬ á¡ááá¯ááºá¡ááŒá¯á¶áá»á¬áž ááŸááá±ááá¯ááºáá±á¬ááŒá±á¬áá·áº ááŒá
áºááá¯ááºáááºá áááºážááá¯ááŸá±á¬ááºááŸá¬ážáááºááŸáá·áº á¡áá¬ááá¹áá¯á¡áá
áºáá»á¬ážáááºáá®ážáá±á¬á¡áá«ááœáẠá¡áá¯ááºáá®á á¡ááá¯á¡áá»á±á¬ááºáá»áá¯ážáááºááᯠááá¯ážááá¯ážááŸááºážááŸááºážá¡áá¯á¶ážááŒá¯ááŒááºážá ááá¯áá±á¬ááºážáá«áááºá
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 ááá¯á
ááá·áºááŸá¯ áá¯á¶ážááááŸááá±á¬á·áá«á á¡ááá®áá±ážááŸááºážá á¡á±ážá
ááºááŸá¯á
áááºááá·áºá¡áá±á¡ááœááºá¡áá±á«áº á
áááºáá»áááºá ááŸá®ááá¯ááŸá¯ááᯠáá°áá®áá±á¬ ááá¯ááºážáá¬ááŸá¯ááŒá¯áá¯ááºááŒááºážááŒáá·áº ááááºááᯠáá»áœááºá¯ááºááá¯á· ááŒááºááœá±á·ááááºá
á¡á
áááºážáá±á¬ááºáá»ááºážááẠnested á¡áá¬ááá¹áá¯áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠáááºááááºáá»ááºááá¯ááºáá»áááºááœáẠá¡á¡á±ážá
áááºááŸá¯á¡áá±á¡ááœááºá¡áá±á«áº á¡ááá®áá±ážááŸááºážá
áááºáá»áááºá ááŸá®ááá¯ááŸá¯ááᯠááŒááááºá
ááááºáá»á¬ážááŸáá·áº áá±á¬ááºáá»ááº
á¡ááŒá²ááŒá®ážááœá¬ážáá±áá±á¬ Realm áá±áá¬áá±á·á áºááẠá¡ááá®áá±ážááŸááºážááᯠá áááºááẠá¡ááœááºááŸá±ážááœá±ážá á±áááºá áá»áœááºá¯ááºááá¯á·ááẠnested á¡áá¬ááá¹áá¯áá»á¬ážá ááá¯ááºááá¯áẠ"cascading delete" ááŒáá·áº á¡ááºááááºáá áºáᯠáá¯ááºááŒááºáá²á·áááºá ááᯠáá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááá¯á¶ážááŒááºáá»ááºááẠ_app_start áááºááá áºááŸáá áºááá·áº áá»áŸá±á¬ááºááœáŸá¬á áááºáá»áááºááᯠáááºááá¯á·á¡áá»áá¯ážáááºáá±á¬ááºáááºááᯠá á±á¬áá·áºááŒáá·áºááŒá®áž á¡áá²ááŒááºáá«áááºá
ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáááºáá±á«ááºáž 90 ááŒá¬ á¡áá»áááºáá°á ááŒáá·áºááŸá¯ááá¯ááºáááº- á¡ááá®áá±ážááŸááºážááœáá·áºáá»áááºá áá»ááºážáá»áŸááŸáá·áº áá¯á¶ážá
áœá²áá°áá»á¬ážá 95th áá¬ááá¯ááºááŸá¯ááºážááœáẠáá»áá±á¬ááºááá·áºá¡áá¬ááá¯á·ááẠáá»á±á¬á·áááºážáá¬ááŒá®áž áááá¯ážáá±á¬á·áá±á
áá¯ááŸá
áºáááºááŒá¬ááá¬ážááá¯ááŒáá·áºáá»áŸáẠ_app_start áááºááá
áºááẠáá¯á¶ážááá¯á¶áá±á¬ááºáá¯á¶áááŒá®áž 1 á
áá¹ááá·áºáááºáááºážáá«áááºá
_app_start á áá»ááºážáá»áŸáááºááá¯ážááẠ5 á áá¹ááá·áºáááºáá»á±á¬áºááœááºáá«á Firebase ááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááºážááᯠáááºááá·áºááá»áá¯ážáááºáá«áááºá ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á·ááŒááºááá¯ááºáááºá¡ááá¯ááºážá áááºááẠá€á¡áá¬ááᯠá¡á¬ážáááá¯ážááá·áºáá² áááºáá±á¬ááºááŒá®áž á¡ááá¡áááºážá á áºáá±ážáá«á
Realm áá±áá¬áá±á·á áºááá°ážááŒá¬ážáá»ááºááŸá¬áááºážáááºáááºá ááºááŸá¯áááŸááá±á¬áá±áá¬áá±á·á áºááŒá áºáááºá á¡áá¯á¶ážááŒá¯áááœááºáá°ááŒááºážá ORM ááŒá±ááŸááºážáá»ááºáá»á¬ážááŸáá·áº á¡áá¬ááá¹áá¯áá»áááºáááºááŒááºážáá»á¬ážááŸáá·áº áááºáá°áá±áá±á¬áºáááºážá áááºážááœáẠcascade áá»ááºááŒááºážáááŸááá«á
áááºážááᯠááá·áºááœááºážá ááºážá á¬ážááŒááºážáááŸááá«áá á¡ááá¯ááºá¡ááŒá¯á¶á¡áá¬ááá¹áá¯áá»á¬áž á á¯ááŒá¯á¶áá¬ááŒá®áž âááá¯á ááá·áºááŒááºážâ ááŒá áºáááá·áºáááºá áá±áá¬áá±á·á áºááẠá¡áááºáááŒááºááŒá®ážááœá¬ážáá±áááºááŒá áºááŒá®áž áááºážááẠá¡ááá®áá±ážááŸááºážáááŸá±ážááœá±ážááŒááºáž ááá¯á·ááá¯áẠá áááºááŒááºážá¡áá±á«áº áááºáá±á¬ááºááŸá¯ááŸááááºááŒá áºáááºá
Realm ááŸá á¡áá¬ááá¹áá¯áá»á¬ážááᯠáá»ááºááŒááºá
áœá¬ áááºááŸá¬ážáááºážááᯠáá»áœááºá¯ááºá á¡ááœá±á·á¡ááŒá¯á¶ááᯠáá»áŸáá±áá²á·áááºá ááœááºáááºááá¯ááºáá±ážáá±á¬áºáááºáž á¡áá»áááºá¡áá±á¬áºááŒá¬á¡á±á¬áẠááŒá±á¬ááá¯áá±ááŒáá«ááŒá®á
á€á¡ááºá¹áá«áááºá áááŒá¬áá® ááœááºáá±á«áºáá¬ááá·áº á¡ááœááºá¡ááŒááºááŸáá·áº áááºáááºá ááœá±ážááœá±ážáá±áá±á¬áºáááºáž Realm ááœáẠcascade áá»ááºááŒááºáž áááŸáááŒááºážááᯠáá®ááá¯ááºážááŒáá·áº áá¯ááºáá±á¬ááºáá«áááºá á¡áááºá áááºááẠá¡ááá®áá±ážááŸááºážá¡áá
áºáá
áºáá¯ááᯠáá®ááá¯ááºážááœá²áá±áá«á áááºážááᯠááá·áºááœááºážá
ááºážá
á¬ážáá«á á¡áááºá áááºááẠRealm ááá¯á¡áá¯á¶ážááŒá¯áá±áá«áá ááá·áºááœááºááá¯áá²á·ááá¯á·áá±á¬ááŒá¿áá¬áá»á¬ážááŸááááŸáá
á
áºáá±ážáá«á
source: www.habr.com