áĄááŻáśá¸ááźáŻáá°áĄáŹá¸ááŻáśá¸áááş áááŻáááŻááşá¸áĄáááŽááąá¸áážááşá¸ááťáŹá¸áá˝ááş ááťááşááźááşá á˝áŹ á áááşáĄááŻáśá¸ááźáŻáááŻááşááźáŽá¸ ááŻáśáˇááźááşáážáŻáážáááąáŹ UI ááᯠáááşááśááá°ááŤá áĄáááŽááąá¸áážááşá¸ááᯠá áááşáááş áĄááťáááşáĄááąáŹáşááźáŹááŤá áĄááŻáśá¸ááźáŻáá°áááş áááşá¸áááşá¸ááźááşá¸áážááˇáş ááąáŤááá˝ááşááźááşá¸áááŻáˇááᯠá áááşááśá áŹá¸ááááşá áĄáááŽááąá¸áážááşá¸ááᯠáá áááşááŽáá˝ááşáááş ááŻáśá¸á á˝á˛áá°ááĄáá˝áąáˇáĄááźáŻáśááᯠáĄáá˝ááşááá° ááŻáá°áááŻááşáááş áááŻáˇáááŻááş ááŻáśá¸á á˝á˛áá°ááᯠááŻáśá¸áááŻáśá¸áážáŻáśá¸áááŻááşáááşá
Dodo Pizza áĄááşááşáááş ááťááşá¸ááťážáĄáŹá¸ááźááˇáş á áááşáááş á á áášáááˇáşááźáŹááźááˇáşááźáąáŹááşá¸áážááˇáş áĄááťááŻáˇááąáŹ âááśááąáŹááşá¸áá°ááťáŹá¸â áĄáá˝ááş áá á áášáááˇáşááž áá á áášáááˇáşááźáŹááźáąáŹááşá¸ ááťá˝ááşáŻááşáááŻáˇ áá˝áąáˇáážááá˛áˇáááşá
ááźááşááąáŹááşáážáŻáĄáąáŹááşáá˝ááş ááťáąáŹáşáá˝ážááşáá˝ááşáĄááŻáśá¸áááşááźááˇáş ááŹááşáááşá¸áá áşááŻááşááźá áşáááş- Realm ááąááŹááąáˇá áş ááźáŽá¸áá˝áŹá¸áážáŻá áážááşááŹááşáááŻá áááˇáşáážáŻá ááťá˝ááşáŻááşáááŻáˇ áĄáááŻááşáĄááźáŻáśáĄááŹááášááŻááťáŹá¸ááᯠá áŻááąáŹááşá¸ááŻáśá áááŻáˇááąáŹááş áááááááŻááşááᯠáá˝á˛ááŻááşáᏠáĄááŹáĄáŹá¸ááŻáśá¸ááᯠááźááşáááşááźááşá¸áĄááźáąáŹááşá¸á

ááąáŹááşá¸ááŤá¸ááąá¸ááŹá¸áá°- â Dodo Pizza áážá Android developer á
áĄáááŽááąá¸áážááşá¸ áĄááŻááşáá˝ááşááᯠáážáááşááŹááž áááááŻááşááąáŹááşááťááşá onResume() áááŻáˇ ááŻáśá¸á áášáááˇáşáááş áĄááŻáśá¸ááážáááźá áşáááşá áĄááťááŻáˇááąáŹáĄááŻáśá¸ááźáŻáá°ááťáŹá¸áĄáá˝ááşá á áááşááťáááşáááş 15-20 á áášáááˇáşáááŻáˇááąáŹááşáážááá˛áˇáááşá ááŤá áááşáááŻááźá áşáááŻááşááá˛á
á
áŹáááşáááŻáˇ áĄááťáááşááážááá°ááťáŹá¸áĄáá˝ááş áĄáááŻááťáŻáśá¸ááąá¸ááŤá
ááťá˝ááşáŻááşáááŻáˇá Realm ááąááŹááąáˇá
áşáááş áĄááŻáśá¸ááážáááąáŹ ááźáŽá¸áá˝áŹá¸ááŹáá˛áˇáááşá áĄááťááŻáˇááąáŹ áĄááŹááášááŻááťáŹá¸ááᯠááťááşááá
áşáᲠáĄáááşáááźááş á
áŻááąáŹááşá¸ááąááŤáááşá áĄáááŽááąá¸áážááşá¸ á
áááşááťáááşáááş áááźááşá¸ááźááşá¸ áááŻá¸ááŹáááşá áááŻáˇááąáŹááş ááťá˝ááşáŻááşáááŻáˇá áááşá¸ááᯠááźááşáááşááźáŽá¸ á
áááşááťáááşáááş áá
áşáážááşáááŻáˇááąáŹááşáážááá˛áˇáááş - áááşá¸áááş 1 á
áášáááˇáşáááşáááşá¸ááŹááźáŽá¸ ááááŻá¸ááąáŹáˇááŤá ááąáŹááşá¸ááŤá¸áá˝ááş áĄááźáąáĄááąááťáŹá¸ááᯠáá˝á˛ááźááşá¸á
áááşááźáŹááźááşá¸áážááˇáş ááźáąáážááşá¸ááťááşáážá
áşáᯠ- áĄááźááşáá
áşááŻáážááˇáş ááŻáśáážááşáá
áşáᯠááŤáááşáááşá
ááźáżááŹááᯠáážáŹáá˝áąááźáŽá¸ áá˝á˛ááźááşá¸á áááşááźáŹááŤá
áááąáˇááąááşáá˝ááş áááşáááˇáşáááŻáááŻááşá¸áĄáááŽááąá¸áážááşá¸áááᯠááťááşááźááşá á˝áŹáážááˇáş ááŻáśáˇááźááşáážáŻáážáááááşááźá áşáááşá ááŤááąáááˇáş áĄá˛ááŤá áááŻáááŻááşá¸áĄááşááşáĄááźáąáŹááşá¸áᲠáááŻááşááŤáá°á¸á áááşááąáŹááşáážáŻáá áşááŻáážááˇáş ááŻáášáááŽáá áşááŻáážááˇáş áĄááźááşáĄáážááşáááşáá˝ááşáážáŻáááŻááşáᏠááŻáśá¸á á˝á˛áá°áĄáá˝áąáˇáĄááźáŻáśáááş áážáŻááşáá˝áąá¸ááąáŹáĄááŹááźá áşáááşá áĽáááŹáĄáŹá¸ááźááˇáşá ááťá˝ááşáŻááşáááŻáˇááĄááźáąáĄááąáá˝ááşá ááąá¸áááŻáˇáážáŻáĄááźááşáážáŻááşá¸áááş ááŽááŹáááşááąáŹááşáážáŻáĄáá˝ááş áĄááááá˝ážááşááźááťááşáá áşááŻááźá áşáááşá áááŻáˇááąáŹááşáážáŻááźááşáááşááŤá ááŽááŹáá°ááŹáááşááźá áşááźáŽá¸ áááŻá áŹá¸ááťááşááąáŹ customer ááťáŹá¸ áĄááźáŹááźáŽá¸á áąáŹááˇáşá ááŹááááŻááŤá áĄááşáááŽááąá¸áážááşá¸áĄáá˝ááşá áá áşáááşá ááźááşáááşááąáŹáááşááąáŹááşáážáŻáááśá áŹá¸ááťááşáááŻáááşááŽá¸áááşáĄááąá¸ááźáŽá¸áááşá áĄáááşááźáąáŹááˇáşáááŻááąáŹáşáĄáááŽááąá¸áážááşá¸áááşá áááşáááşá áášáááˇáş 20 ááŹááźáŹááŤáá ááŽááŹáááŻáááşááťážááźáŹáĄáąáŹááşá áąáŹááˇáşáááŻááşá¸ááááşáááşá¸á
áĄá áááŻááşá¸áá˝ááşá ááťá˝ááşáŻááşáááŻáˇáááŻááşáááŻááşáááş áá áşááŤáá áşááś ááťážáąáŹááşáá˝ážáŹááᯠá áááşáááş á áášáááˇáşáĄáááşá¸áááşááźáŹááźáŽá¸ááąáŹááş áááşá¸áááş áĄááťáááşáááşááťážááźáŹáááşáážááˇáş áááşáááşá áĄááźáŹá¸ááŻááşááąáŹáşáááŻááşáááşááťáŹá¸ááśááž áááŻááşááźáŹá¸ááťááşááťáŹá¸ááᯠááźáŹá¸ááŹáááąáŹáˇáááşá ááŤááąáááˇáş ááŽáĄááźáąáĄááąááᯠáááşáááŻááşááźááşááŻááşáááŻáˇááááŤáá°á¸á
áááşááąáŹááşááźáŹáážáŹáá˛? áĄá áĄááşáááŽááąá¸áážááşá¸áá áşááŻááĄáąá¸á ááşáážáŻáááş 5 á áášáááˇáşáááşáááşá¸ááŤáá áááşá¸ááᯠ"ááŻáśáážááşáĄáááŻááşá¸" ááŻáááşáážááşáááşá Dodo Pizza Android áĄááşááş (Firebase áááŻááşá¸áá˝áŹááťááşááťáŹá¸áĄá ) áážáŹ ááťááşá¸ááťážáĄáŹá¸ááźááˇáş á á áášáááˇáşáĄáá˝ááşá¸ - âááááŻá¸áá°á¸á áááźáąáŹááşáá°á¸â áááŻáˇ áá°áááŻáˇááźáąáŹááźáááşá
áááŻáˇááąáŹáş ááąáŹááşáááŻááşá¸áá˝ááş áĄááşáááŽááąá¸áážááşá¸ááᯠá áááşáááş áĄáá˝ááşááźáŹáážááşá á˝áŹ áĄááťáááşáá°áá˛áˇáááźáąáŹááşá¸ áááŻááşááźáŹá¸áážáŻááťáŹá¸ á áááşááąáŤáşááąáŤááşááŹáááşá áĄá ááźáŻá âáĄáá˝ááşá áĄáá˝ááşáážááşâ áá°áááşááᯠáááŻááşá¸ááŹáááş ááŻáśá¸ááźááşáá˛áˇáááşá ááźáŽá¸ááąáŹáˇ áĄá˛ááŤáĄáá˝ááş Firebase ááźáąááŹááśááᯠááŻáśá¸áááşá .

á¤á
áśáážáŻááşá¸ááźáąááŹááąáŹááşáááş áĄááŻáśá¸ááźáŻáá°áĄáááŽááąá¸áážááşá¸áááŻáá˝ááˇáşáááˇáşáĄááťáááşáážááˇáş áááááŻáśá¸ááŻááşááąáŹááşááťááşá onResume() ááᯠááŻááşááąáŹááşáááˇáşáĄáááŻááşáĄáááˇáşááźáŹá¸áĄááťáááşááᯠáááŻááşá¸ááŹáááşá Firebase Console áá˝ááş á¤áááşááá
áşááᯠ_app_start ááŻááąáŤáşáááşá áá˝ááşááąáŤáşááŹáá˛áˇáááş-
- 95th ááŹáááŻááşáážáŻááşá¸áĄáááş áĄááŻáśá¸ááźáŻáá°ááťáŹá¸áĄáá˝ááş á áááşáá˝ááˇáşááťáááşáááş 20 á áášáááˇáşááŽá¸ááŤá¸ (áĄááťááŻáˇáááşáááŻááźáŹáááş) áááş ááťááşá¸ááťážáĄáĄáąá¸á áááşááťáááşáááş 5 á áášáááˇáşáááşáááşá¸ááąáŹáşáááşá¸á
- á áááşááťáááşáááş ááááşá¸ááąáááşáááŻá¸áááŻááşááąáŹáşáááşá¸ áĄááťáááşáážááˇáşáĄááťáž ááźáŽá¸áá˝áŹá¸ááŹáááşá ááŤááąáááˇáş áá áşááŤáááąáážáŹ áĄá ááşááťááŹáá˝áąáážááááşá áá˝á˛ááźááşá¸á áááşááźáŹáážáŻá ááąá¸ááᯠáááş 90 áĄáá áááŻá¸ááźážááˇáşáááŻááşááąáŹáĄá፠á¤ááŻáśá áśááᯠáá˝áąáˇáážááá˛áˇáááşá

áĄáá˝áąá¸áážá
áşáᯠááąáŤáşááŹáááş á
- áá áşááŻáᯠááąáŤááşááźáŹá¸ááąáááşá
- ᤠ"áá áşá áŻáśáá áşááŻ" ááᯠááŻááşááąááźáŽá¸ááąáŹááş ááźááşáááşáááşáážááşááźáŽá¸ áááşááśááąáŤááşááźáŹá¸áááşá
âááąááŹááąáˇá áşáá˛áˇ áá áşááŻááŻááźá áşáááŻááşáááşáâ áᯠááťá˝ááşáŻááşáááŻáˇáá˝áąá¸ááźáŽá¸ ááťá˝ááşáŻááşáááŻáˇ áážááşááŤáááşá ááááŚá¸á á˝áŹá ááťá˝ááşáŻááşáááŻáˇáááş ááąááŹááąáˇá áşááᯠáááşáážáşáá áşááŻáĄááźá áş áĄááŻáśá¸ááźáŻáááşá áá˝ážáąáˇááźáąáŹááşá¸ááźááşá¸áĄááąáŹáĄáá˝ááşá¸ áááşá¸ááᯠááťá˝ááşáŻááşáááŻáˇ áážááşá¸áááşá¸áá˛áˇáááşá ááŻááááĄááąáážááˇáşá áĄáááŽááąá¸áážááşá¸á áááşááąáŹáĄááŤáá˝ááşááąááŹááąáˇá áşáááŻáá˝ááˇáşáááşá áĄáŹá¸ááŻáśá¸ áááŻááşáááşááŤáááşá
Realm ááąááŹááąáˇá áşáážáŹ ááŹááźá áşááąááŹáá˛
ááťá˝ááşáŻááşáááŻáˇáááş áááááŻáśá¸áááˇáşáá˝ááşá¸ááźááşá¸ááž á áááşááźáŽá¸ áĄááŻáśá¸ááźáŻááąá ááşáĄáá˝ááşá¸ ááąááŹááąáˇá áşá áĄááźáąáŹááşá¸áĄááŹááťáŹá¸áááş áĄáááŽááąá¸áážááşá¸ááááşáááşá¸áá áşááťážáąáŹááş áááşáááŻáˇááźáąáŹááşá¸áá˛áá˝áŹá¸áááşááᯠá áááşá á áşááąá¸áá˛áˇááŤáááşá áááşáááş Realm ááąááŹááąáˇá áşáážááááˇáş áĄááźáąáŹááşá¸áĄááŹááťáŹá¸ááᯠááźááˇáşáážáŻáááŻááşááŤáááşá áááŻáˇáááŻááş áááŻááşáážáá áşáááˇáş áááŻáááŻáĄááąá¸á áááşáážááşá¸áááşá¸á á˝áŹ áá˝ááˇáşááŤá . ADB áážáá áşáááˇáş ááąááŹááąáˇá áşá áĄááźáąáŹááşá¸áĄááŹááťáŹá¸ááᯠááźááˇáşáážáŻáááş 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

