ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ื›ืœ ื”ืžืฉืชืžืฉื™ื ืœื•ืงื—ื™ื ืืช ื”ื”ืฉืงื” ื”ืžื”ื™ืจื” ื•ืžืžืฉืง ื”ืžืฉืชืžืฉ ื”ืžื’ื™ื‘ ื‘ืืคืœื™ืงืฆื™ื•ืช ืœื ื™ื™ื“ ื›ืžื•ื‘ื ื™ื ืžืืœื™ื”ื. ืื ืœืืคืœื™ืงืฆื™ื” ืœื•ืงื— ื”ืจื‘ื” ื–ืžืŸ ืœื”ืคืขื™ืœ, ื”ืžืฉืชืžืฉ ืžืชื—ื™ืœ ืœื”ืจื’ื™ืฉ ืขืฆื•ื‘ ื•ื›ืขืก. ืืชื” ื™ื›ื•ืœ ื‘ืงืœื•ืช ืœืงืœืงืœ ืืช ื—ื•ื•ื™ืช ื”ืœืงื•ื— ืื• ืœืื‘ื“ ืœื—ืœื•ื˜ื™ืŸ ืืช ื”ืžืฉืชืžืฉ ืขื•ื“ ืœืคื ื™ ืฉื”ื•ื ืžืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘ืืคืœื™ืงืฆื™ื”.

ื’ื™ืœื™ื ื• ืคืขื ืฉืœืืคืœื™ืงืฆื™ื” Dodo Pizza ืœื•ืงื— 3 ืฉื ื™ื•ืช ืœื”ืคืขื™ืœ ื‘ืžืžื•ืฆืข, ื•ืœื›ืžื” "ื‘ืจื™ ืžื–ืœ" ื–ื” ืœื•ืงื— 15-20 ืฉื ื™ื•ืช.

ืžืชื—ืช ืœื—ื™ืชื•ืš ื™ืฉ ืกื™ืคื•ืจ ืขื ืกื•ืฃ ื˜ื•ื‘: ืขืœ ืฆืžื™ื—ืช ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ื”-Realm, ื“ืœื™ืคืช ื–ื™ื›ืจื•ืŸ, ืื™ืš ืฆื‘ืจื ื• ืื•ื‘ื™ื™ืงื˜ื™ื ืžืงื•ื ื ื™ื, ื•ืื– ื”ืชืื’ื“ื ื• ื•ืชื™ืงื ื• ื”ื›ืœ.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”
ืžื—ื‘ืจ ื”ืžืืžืจ: ืžืงืกื™ื ืงืฆ'ื™ื ืงื™ืŸ - ืžืคืชื— ืื ื“ืจื•ืื™ื“ ื‘-Dodo Pizza.

ืฉืœื•ืฉ ืฉื ื™ื•ืช ืžืœื—ื™ืฆื” ืขืœ ืกืžืœ ื”ืืคืœื™ืงืฆื™ื” ืœ-onResume() ืฉืœ ื”ืคืขื™ืœื•ืช ื”ืจืืฉื•ื ื” ื”ืŸ ืื™ื ืกื•ืฃ. ื•ืขื‘ื•ืจ ื—ืœืง ืžื”ืžืฉืชืžืฉื™ื, ื–ืžืŸ ื”ื”ืคืขืœื” ื”ื’ื™ืข ืœ-15-20 ืฉื ื™ื•ืช. ืื™ืš ื–ื” ื‘ื›ืœืœ ืืคืฉืจื™?

ืชืงืฆื™ืจ ืงืฆืจ ืžืื•ื“ ืœืžื™ ืฉืื™ืŸ ืœื• ื–ืžืŸ ืœืงืจื•ื
ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ื”ืžืžืœื›ื” ืฉืœื ื• ื’ื“ืœ ื‘ืœื™ ืกื•ืฃ. ื—ืœืง ืžื”ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืžืงื•ื ื ื™ื ืœื ื ืžื—ืงื•, ืืœื ื”ืฆื˜ื‘ืจื• ื›ืœ ื”ื–ืžืŸ. ื–ืžืŸ ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื’ื“ืœ ื‘ื”ื“ืจื’ื”. ืื—ืจ ื›ืš ืชื™ืงื ื• ืืช ื–ื”, ื•ื–ืžืŸ ื”ืืชื—ื•ืœ ื”ื’ื™ืข ืœื™ืขื“ - ื”ื•ื ื”ืคืš ืคื—ื•ืช ืžืฉื ื™ื™ื” ืื—ืช ื•ืœื ื’ื“ืœ ืขื•ื“. ื”ืžืืžืจ ืžื›ื™ืœ ื ื™ืชื•ื— ื”ืžืฆื‘ ื•ืฉื ื™ ืคืชืจื•ื ื•ืช - ืžื”ื™ืจ ื•ืจื’ื™ืœ.

ื—ื™ืคื•ืฉ ื•ื ื™ืชื•ื— ื”ื‘ืขื™ื”

ื›ื™ื•ื, ื›ืœ ืืคืœื™ืงืฆื™ื” ืœื ื™ื™ื“ ื—ื™ื™ื‘ืช ืœื”ืฉื™ืง ื‘ืžื”ื™ืจื•ืช ื•ืœื”ื™ื•ืช ืจืกืคื•ื ืกื™ื‘ื™ืช. ืื‘ืœ ื–ื” ืœื ืงืฉื•ืจ ืจืง ืœืืคืœื™ืงืฆื™ื” ืœื ื™ื™ื“. ื—ื•ื•ื™ืช ืžืฉืชืžืฉ ืฉืœ ืื™ื ื˜ืจืืงืฆื™ื” ืขื ืฉื™ืจื•ืช ื•ื—ื‘ืจื” ื”ื™ื ื“ื‘ืจ ืžื•ืจื›ื‘. ืœื“ื•ื’ืžื”, ื‘ืžืงืจื” ืฉืœื ื•, ืžื”ื™ืจื•ืช ื”ืžืฉืœื•ื— ื”ื™ื ืื—ื“ ื”ืžื“ื“ื™ื ื”ืžืจื›ื–ื™ื™ื ืœืฉื™ืจื•ืช ืคื™ืฆื”. ืื ื”ืžืฉืœื•ื— ื™ื”ื™ื” ืžื”ื™ืจ ื”ืคื™ืฆื” ืชื”ื™ื” ื—ืžื”, ื•ื”ืœืงื•ื— ืฉืจื•ืฆื” ืœืื›ื•ืœ ืขื›ืฉื™ื• ืœื ื™ืฆื˜ืจืš ืœื—ื›ื•ืช ื”ืจื‘ื”. ืœืืคืœื™ืงืฆื™ื”, ื‘ืชื•ืจื”, ื—ืฉื•ื‘ ืœื™ืฆื•ืจ ืชื—ื•ืฉื” ืฉืœ ืฉื™ืจื•ืช ืžื”ื™ืจ, ื›ื™ ืื ืœืืคืœื™ืงืฆื™ื” ืœื•ืงื— ืจืง 20 ืฉื ื™ื•ืช ืœื”ืฉื™ืง, ืื– ื›ืžื” ื–ืžืŸ ืชืฆื˜ืจื›ื• ืœื—ื›ื•ืช ืœืคื™ืฆื”?

ื‘ื”ืชื—ืœื”, ืื ื—ื ื• ืขืฆืžื ื• ืขืžื“ื ื• ื‘ืคื ื™ ื”ืขื•ื‘ื“ื” ืฉืœืคืขืžื™ื ื”ืืคืœื™ืงืฆื™ื” ืœืงื—ื” ื›ืžื” ืฉื ื™ื•ืช ืœื”ืคืขืœื”, ื•ืื– ื”ืชื—ืœื ื• ืœืฉืžื•ืข ืชืœื•ื ื•ืช ืžืขืžื™ืชื™ื ืื—ืจื™ื ืขืœ ื›ืžื” ื–ืžืŸ ื–ื” ืœืงื—. ืื‘ืœ ืœื ื”ืฆืœื—ื ื• ืœื—ื–ื•ืจ ืขืœ ื”ืžืฆื‘ ื”ื–ื” ื‘ืื•ืคืŸ ืขืงื‘ื™.

ื›ืžื” ืืจื•ืš ื–ื”? ืœืคื™ ืชื™ืขื•ื“ ืฉืœ ื’ื•ื’ืœ, ืื ื”ืชื—ืœื” ืงืจื” ืฉืœ ื™ื™ืฉื•ื ื ืžืฉื›ืช ืคื—ื•ืช ืž-5 ืฉื ื™ื•ืช, ืื– ื–ื” ื ื—ืฉื‘ "ื›ืื™ืœื• ื ื•ืจืžืœื™". ืืคืœื™ืงืฆื™ื™ืช ืื ื“ืจื•ืื™ื“ Dodo Pizza ื”ื•ืฉืงื” (ืœืคื™ ืžื“ื“ื™ Firebase _app_start) ื‘ืฉืขื” ื”ืชื—ืœื” ืงืจื” ื‘ืžืžื•ืฆืข ืชื•ืš 3 ืฉื ื™ื•ืช - "ืœื ื ื”ื“ืจ, ืœื ื ื•ืจื", ื›ืžื• ืฉืื•ืžืจื™ื.

ืื‘ืœ ืื– ื”ืชื—ื™ืœื• ืœื”ื•ืคื™ืข ืชืœื•ื ื•ืช ืขืœ ื›ืš ืฉื”ืืคืœื™ืงืฆื™ื” ืœืงื—ื” ื”ืจื‘ื” ืžืื•ื“ ืžืื•ื“ ื–ืžืŸ ืœื”ืฉื™ืง! ืžืœื›ืชื—ื™ืœื” ื”ื—ืœื˜ื ื• ืœืžื“ื•ื“ ืžื” ื–ื” "ืžืื•ื“, ืžืื•ื“, ืžืื•ื“ ืืจื•ืš". ื•ื”ืฉืชืžืฉื ื• ื‘-Firebase Trace ื‘ืฉื‘ื™ืœ ื–ื” ืžืขืงื‘ ืื—ืจ ื”ืชื—ืœืช ื”ืืคืœื™ืงืฆื™ื”.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ืžืขืงื‘ ืกื˜ื ื“ืจื˜ื™ ื–ื” ืžื•ื“ื“ ืืช ื”ื–ืžืŸ ื‘ื™ืŸ ื”ืจื’ืข ืฉื‘ื• ื”ืžืฉืชืžืฉ ืคื•ืชื— ืืช ื”ืืคืœื™ืงืฆื™ื” ื•ืขื“ ืœืจื’ืข ื‘ื™ืฆื•ืข onResume() ืฉืœ ื”ืคืขื™ืœื•ืช ื”ืจืืฉื•ื ื”. ื‘-Firebase Console ื”ืžื“ื“ ื”ื–ื” ื ืงืจื _app_start. ื”ืชื‘ืจืจ ืฉ:

  • ื–ืžื ื™ ื”ืืชื—ื•ืœ ืฉืœ ืžืฉืชืžืฉื™ื ืžืขืœ ื”ืื—ื•ื–ื•ืŸ ื”-95 ื”ื ื›ืžืขื˜ 20 ืฉื ื™ื•ืช (ื—ืœืงื ืืฃ ืืจื•ื›ื™ื ื™ื•ืชืจ), ืœืžืจื•ืช ืฉื–ืžืŸ ื”ืืชื—ื•ืœ ื”ืงืจ ื”ื—ืฆื™ื•ื ื™ ื”ื•ื ืคื—ื•ืช ืž-5 ืฉื ื™ื•ืช.
  • ื–ืžืŸ ื”ื”ืคืขืœื” ืื™ื ื• ืขืจืš ืงื‘ื•ืข, ืืœื ื’ื“ืœ ืขื ื”ื–ืžืŸ. ืื‘ืœ ืœืคืขืžื™ื ื™ืฉ ื˜ื™ืคื•ืช. ืžืฆืื ื• ื“ืคื•ืก ื–ื” ื›ืฉื”ื’ื“ืœื ื• ืืช ืกื•ืœื ื”ื ื™ืชื•ื— ืœ-90 ื™ืžื™ื.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ืฉืชื™ ืžื—ืฉื‘ื•ืช ืขืœื• ื‘ืจืืฉ:

  1. ืžืฉื”ื• ื“ื•ืœืฃ.
  2. ื”"ืžืฉื”ื•" ื”ื–ื” ืžืชืืคืก ืœืื—ืจ ื”ืฉื—ืจื•ืจ ื•ืื– ื“ื•ืœืฃ ืฉื•ื‘.

"ื›ื ืจืื” ืžืฉื”ื• ืขื ืžืกื“ ื”ื ืชื•ื ื™ื", ื—ืฉื‘ื ื• ื•ืฆื“ืงื ื•. ืจืืฉื™ืช, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ื›ืžื˜ืžื•ืŸ; ื‘ืžื”ืœืš ื”ื”ื’ื™ืจื” ืื ื• ืžื ืงื™ื ืื•ืชื•. ืฉื ื™ืช, ืžืกื“ ื”ื ืชื•ื ื™ื ื ื˜ืขืŸ ื›ืืฉืจ ื”ื™ื™ืฉื•ื ืžืชื—ื™ืœ. ื”ื›ืœ ืžืฉืชืœื‘ ื‘ื™ื—ื“.

ืžื” ืจืข ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ Realm

ื”ืชื—ืœื ื• ืœื‘ื“ื•ืง ื›ื™ืฆื“ ืžืฉืชื ื” ื”ืชื•ื›ืŸ ืฉืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื‘ืžื”ืœืš ื—ื™ื™ ื”ืืคืœื™ืงืฆื™ื”, ืžื”ื”ืชืงื ื” ื”ืจืืฉื•ื ื” ื•ื‘ื”ืžืฉืš ื‘ืžื”ืœืš ื”ืฉื™ืžื•ืฉ ื”ืคืขื™ืœ. ืืชื” ื™ื›ื•ืœ ืœื”ืฆื™ื’ ืืช ื”ืชื•ื›ืŸ ืฉืœ ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ื”ืžืžืœื›ื” ื“ืจืš ืกื˜ื˜ื• ืื• ื‘ื™ืชืจ ืคื™ืจื•ื˜ ื•ื‘ืจื•ืจ ืขืœ ื™ื“ื™ ืคืชื™ื—ืช ื”ืงื•ื‘ืฅ ื“ืจืš ืกื˜ื•ื“ื™ื• ืžืžืœื›ื”. ื›ื“ื™ ืœื”ืฆื™ื’ ืืช ืชื•ื›ืŸ ืžืกื“ ื”ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช ADB, ื”ืขืชืง ืืช ืงื•ื‘ืฅ ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ Realm:

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

ืœืื—ืจ ืฉื‘ื“ืงื ื• ืืช ืชื•ื›ืŸ ืžืกื“ ื”ื ืชื•ื ื™ื ื‘ื–ืžื ื™ื ืฉื•ื ื™ื, ื’ื™ืœื™ื ื• ืฉืžืกืคืจ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ืžืกื•ื’ ืžืกื•ื™ื ื’ื“ืœ ื›ืœ ื”ื–ืžืŸ.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”
ื”ืชืžื•ื ื” ืžืฆื™ื’ื” ืงื˜ืข ืฉืœ Realm Studio ืขื‘ื•ืจ ืฉื ื™ ืงื‘ืฆื™ื: ืžืฉืžืืœ - ื‘ืกื™ืก ื”ืืคืœื™ืงืฆื™ื” ื–ืžืŸ ืžื” ืœืื—ืจ ื”ื”ืชืงื ื”, ืžื™ืžื™ืŸ - ืœืื—ืจ ืฉื™ืžื•ืฉ ืคืขื™ืœ. ื ื™ืชืŸ ืœืจืื•ืช ืฉืžืกืคืจ ื”ื—ืคืฆื™ื ImageEntity ะธ MoneyType ื’ื“ืœ ื‘ืื•ืคืŸ ืžืฉืžืขื•ืชื™ (ืฆื™ืœื•ื ื”ืžืกืš ืžืฆื™ื’ ืืช ืžืกืคืจ ื”ื—ืคืฆื™ื ืžื›ืœ ืกื•ื’).

ื”ืงืฉืจ ื‘ื™ืŸ ืฆืžื™ื—ืช ืžืกื“ ื”ื ืชื•ื ื™ื ื•ื–ืžืŸ ื”ื”ืคืขืœื”

ืฆืžื™ื—ื” ื‘ืœืชื™ ืžื‘ื•ืงืจืช ืฉืœ ืžืกื“ื™ ื ืชื•ื ื™ื ื”ื™ื ื’ืจื•ืขื” ืžืื•ื“. ืื‘ืœ ืื™ืš ื–ื” ืžืฉืคื™ืข ืขืœ ื–ืžืŸ ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”? ื–ื” ื“ื™ ืงืœ ืœืžื“ื•ื“ ืืช ื–ื” ื“ืจืš ActivityManager. ืžืื– ืื ื“ืจื•ืื™ื“ 4.4, logcat ืžืฆื™ื’ ืืช ื”ื™ื•ืžืŸ ืขื ื”ืžื—ืจื•ื–ืช ื”ืžื•ืฆื’ืช ื•ื”ืฉืขื”. ื–ืžืŸ ื–ื” ืฉื•ื•ื” ืœืžืจื•ื•ื— ืžืจื’ืข ื”ืคืขืœืช ื”ืืคืœื™ืงืฆื™ื” ื•ืขื“ ืœืกื™ื•ื ืขื™ื‘ื•ื“ ื”ืคืขื™ืœื•ืช. ื‘ืžื”ืœืš ืชืงื•ืคื” ื–ื• ืžืชืจื—ืฉื™ื ื”ืื™ืจื•ืขื™ื ื”ื‘ืื™ื:

  • ื”ืชื—ืœ ืืช ื”ืชื”ืœื™ืš.
  • ืืชื—ื•ืœ ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื.
  • ื™ืฆื™ืจื” ื•ืืชื—ื•ืœ ืคืขื™ืœื•ื™ื•ืช.
  • ื™ืฆื™ืจืช ืคืจื™ืกื”.
  • ืขื™ื‘ื•ื“ ื™ื™ืฉื•ืžื™ื.

ืžืชืื™ื ืœื ื•. ืื ืืชื” ืžืคืขื™ืœ ืืช ADB ืขื ื”ื“ื’ืœื™ื -S ื•-W, ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืคืœื˜ ืžื•ืจื—ื‘ ืขื ื–ืžืŸ ื”ืืชื—ื•ืœ:

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 ืžื’ื”-ื‘ื™ื™ื˜ ืœ-15 ืžื’ื”-ื‘ื™ื™ื˜. ื‘ืกืš ื”ื›ืœ ืžืกืชื‘ืจ ืฉืขื ื”ื–ืžืŸ (ืขื ืฆืžื™ื—ืช ื”ื”ืชื—ืœื•ืช ื”ืงืจื•ืช), ื’ื ื–ืžืŸ ื”ืฉืงืช ื”ืืคืœื™ืงืฆื™ื” ื•ื’ื ื’ื•ื“ืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื’ื“ืœื•. ื™ืฉ ืœื ื• ื”ืฉืขืจื” ืขืœ ื”ื™ื“ื™ื™ื. ื›ืขืช ื ื•ืชืจ ืจืง ืœืืฉืจ ืืช ื”ืชืœื•ืช. ืœื›ืŸ, ื”ื—ืœื˜ื ื• ืœื”ืกื™ืจ ืืช ื”"ื“ืœื™ืคื•ืช" ื•ืœืจืื•ืช ืื ื–ื” ื™ื–ืจื– ืืช ื”ื”ืฉืงื”.

ืกื™ื‘ื•ืช ืœืฆืžื™ื—ื” ืื™ื ืกื•ืคื™ืช ืฉืœ ืžืกื“ื™ ื ืชื•ื ื™ื

ืœืคื ื™ ื”ืกืจืช "ื“ืœื™ืคื•ืช", ื›ื“ืื™ ืœื”ื‘ื™ืŸ ืžื“ื•ืข ื”ืŸ ื”ื•ืคื™ืขื• ืžืœื›ืชื—ื™ืœื”. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื‘ื•ืื• ื ื–ื›ื•ืจ ืžื” ื–ื” ืชื—ื•ื.

ืชื—ื•ื ื”ื•ื ืžืกื“ ื ืชื•ื ื™ื ืœื ื™ื—ืกื™. ื–ื” ืžืืคืฉืจ ืœืš ืœืชืืจ ืงืฉืจื™ื ื‘ื™ืŸ ืื•ื‘ื™ื™ืงื˜ื™ื ื‘ืื•ืคืŸ ื“ื•ืžื” ืœืžืกืคืจ ืžืกื“ื™ ื ืชื•ื ื™ื ื™ื—ืกื™ื™ื ืฉืœ ORM ื‘ืื ื“ืจื•ืื™ื“. ื‘ืžืงื‘ื™ืœ, Realm ืžืื—ืกื ืช ืื•ื‘ื™ื™ืงื˜ื™ื ื™ืฉื™ืจื•ืช ื‘ื–ื™ื›ืจื•ืŸ ืขื ื”ื›ืžื•ืช ื”ืงื˜ื ื” ื‘ื™ื•ืชืจ ืฉืœ ื˜ืจื ืกืคื•ืจืžืฆื™ื•ืช ื•ืžื™ืคื•ื™ื™ื. ื–ื” ืžืืคืฉืจ ืœืš ืœืงืจื•ื ื ืชื•ื ื™ื ืžื”ื“ื™ืกืง ื‘ืžื”ื™ืจื•ืช ืจื‘ื”, ื•ื–ื” ื”ื›ื•ื— ืฉืœ Realm ื•ืœืžื” ื”ื•ื ืื”ื•ื‘.

(ืœืฆื•ืจืš ืžืืžืจ ื–ื”, ืชื™ืื•ืจ ื–ื” ื™ืกืคื™ืง ืœื ื•. ืชื•ื›ืœ ืœืงืจื•ื ืขื•ื“ ืขืœ ืชื—ื•ื ื‘ืžื’ื ื™ื‘ ืชื™ืขื•ื“ ืื• ืืฆืœื ื”ืืงื“ืžื™ื”).

ืžืคืชื—ื™ื ืจื‘ื™ื ืจื’ื™ืœื™ื ืœืขื‘ื•ื“ ื™ื•ืชืจ ืขื ืžืกื“ื™ ื ืชื•ื ื™ื ื™ื—ืกื™ื™ื (ืœืžืฉืœ, ืžืกื“ื™ ื ืชื•ื ื™ื ืฉืœ ORM ืขื SQL ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข). ื•ื“ื‘ืจื™ื ื›ืžื• ืžื—ื™ืงืช ื ืชื•ื ื™ื ืžื“ื•ืจื’ืช ื ืจืื™ื ืœืจื•ื‘ ื›ืžื• ื“ื‘ืจ ืžื•ื‘ืŸ ืžืืœื™ื•. ืื‘ืœ ืœื ื‘ืžืžืœื›ื”.

ืื’ื‘, ืชื›ื•ื ืช ืžื—ื™ืงืช ื”ืžืคืœ ื ืฉืืœื” ื›ื‘ืจ ื–ืžืŸ ืจื‘. ื–ึถื” ืขื“ื›ื•ืŸ ะธ ืื—ืจ, ื”ืงืฉื•ืจื™ื ืืœื™ื•, ื ื“ื•ืŸ ื‘ืื•ืคืŸ ืคืขื™ืœ. ื”ื™ื™ืชื” ืชื—ื•ืฉื” ืฉื–ื” ื™ื™ืขืฉื” ื‘ืงืจื•ื‘. ืื‘ืœ ืื– ื”ื›ืœ ืชื•ืจื’ื ืœื”ื›ื ืกืช ืงื™ืฉื•ืจื™ื ื—ื–ืงื™ื ื•ื—ืœืฉื™ื, ืฉื’ื ื™ืคืชื•ืจ ืื•ื˜ื•ืžื˜ื™ืช ืืช ื”ื‘ืขื™ื” ื”ื–ื•. ื”ื™ื” ื“ื™ ืชื•ืกืก ื•ืคืขื™ืœ ื‘ืžืฉื™ืžื” ื–ื• ื‘ืงืฉื” ืœืžืฉื•ืš, ืฉื”ื•ืคืกืง ืœืขืช ืขืชื” ืขืงื‘ ืงืฉื™ื™ื ืคื ื™ืžื™ื™ื.

ื“ืœื™ืคืช ื ืชื•ื ื™ื ืœืœื ืžื—ื™ืงื” ืžื“ื•ืจื’ืช

ืื™ืš ื‘ื“ื™ื•ืง ื”ื ืชื•ื ื™ื ื“ื•ืœืคื™ื ืื ืืชื” ืžืกืชืžืš ืขืœ ืžื—ื™ืงื” ืžื“ื•ืจื’ืช ืฉืœื ืงื™ื™ืžืช? ืื ื™ืฉ ืœืš ืื•ื‘ื™ื™ืงื˜ื™ ืชื—ื•ื ืžืงื•ื ื ื™ื, ื™ืฉ ืœืžื—ื•ืง ืื•ืชื.
ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” (ื›ืžืขื˜) ืืžื™ืชื™ืช. ื™ืฉ ืœื ื• ื—ืคืฅ 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). ื›ืœ ื”ืฉื“ื•ืช ื”ืจืฉื•ืžื™ื ื”ื ืื•ื‘ื™ื™ืงื˜ื™ ืชื—ื•ื. ืื ื ื›ื ื™ืก ืื•ื‘ื™ื™ืงื˜ ื—ื“ืฉ (copyToRealm() / copyToRealmOrUpdate()) ืขื ืื•ืชื• ืžื–ื”ื”, ืื–ื™ ื”ืื•ื‘ื™ื™ืงื˜ ื”ื–ื” ื™ื•ื—ืœืฃ ืœื—ืœื•ื˜ื™ืŸ. ืื‘ืœ ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืคื ื™ืžื™ื™ื (ืชืžื•ื ื”, customizationEntity ื•-cartComboProducts) ื™ืื‘ื“ื• ืืช ื”ืงืฉืจ ืขื ื”ืื‘ ื•ื™ื™ืฉืืจื• ื‘ืžืกื“ ื”ื ืชื•ื ื™ื.

ืžื›ื™ื•ื•ืŸ ืฉื”ืงืฉืจ ืื™ืชื ืื‘ื“, ืื ื—ื ื• ื›ื‘ืจ ืœื ืงื•ืจืื™ื ืื•ืชื ืื• ืžื•ื—ืงื™ื ืื•ืชื (ืืœื ืื ื›ืŸ ื ื™ื’ืฉื™ื ืืœื™ื”ื ื‘ืžืคื•ืจืฉ ืื• ืžื ืงื™ื ืืช ื›ืœ ื”"ื˜ื‘ืœื”"). ืงืจืื ื• ืœื–ื” "ื“ืœื™ืคื•ืช ื–ื™ื›ืจื•ืŸ".

ื›ืืฉืจ ืื ื• ืขื•ื‘ื“ื™ื ืขื 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()
}
// ะธ ะฟะพั‚ะพะผ ัƒะถะต ัะพั…ั€ะฐะฝัะตะผ

ืื ืชืขืฉื” ื–ืืช, ื”ื›ืœ ื™ืขื‘ื•ื“ ื›ืžื• ืฉืฆืจื™ืš. ื‘ื“ื•ื’ืžื” ื–ื•, ืื ื• ืžื ื™ื—ื™ื ืฉืื™ืŸ ืื•ื‘ื™ื™ืงื˜ื™ Realm ืžืงื•ื ื ื™ื ืื—ืจื™ื ื‘ืชื•ืš image, customizationEntity ื•-cartComboProducts, ื›ืš ืฉืื™ืŸ ืœื•ืœืื•ืช ืžืงื•ื ื ื•ืช ื•ืžื—ื™ืงื•ืช ืื—ืจื•ืช.

ืคืชืจื•ืŸ "ืžื”ื™ืจ".

ื”ื“ื‘ืจ ื”ืจืืฉื•ืŸ ืฉื”ื—ืœื˜ื ื• ืœืขืฉื•ืช ื”ื•ื ืœื ืงื•ืช ืืช ื”ื—ืคืฆื™ื ื”ืฆื•ืžื—ื™ื ื‘ื™ื•ืชืจ ื•ืœื‘ื“ื•ืง ืืช ื”ืชื•ืฆืื•ืช ื›ื“ื™ ืœืจืื•ืช ืื ื–ื” ื™ืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื”ืžืงื•ืจื™ืช ืฉืœื ื•. ืจืืฉื™ืช, ื ื•ืฆืจ ื”ืคืชืจื•ืŸ ื”ืคืฉื•ื˜ ื•ื”ืื™ื ื˜ื•ืื™ื˜ื™ื‘ื™ ื‘ื™ื•ืชืจ, ื›ืœื•ืžืจ: ื›ืœ ื—ืคืฅ ืฆืจื™ืš ืœื”ื™ื•ืช ืื—ืจืื™ ืขืœ ื”ื•ืฆืืช ื™ืœื“ื™ื•. ืœืฉื ื›ืš, ื”ืฆื’ื ื• ืžืžืฉืง ืฉื”ื—ื–ื™ืจ ืจืฉื™ืžื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ Realm ื”ืžืงื•ื ื ื™ื ืฉืœื•:

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

ื•ื™ื™ืฉืžื ื• ืืช ื–ื” ื‘ืื•ื‘ื™ื™ืงื˜ื™ ื”ืชื—ื•ื ืฉืœื ื•:

@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
   )
 }
}

ื•ื›ืŸ ื”ืœืื”, ื ื™ืชืŸ ืœื—ื–ื•ืจ ืขืœ ืงื™ื ื•ืŸ ื—ืคืฆื™ื.

ืœืื—ืจ ืžื›ืŸ ืื ื• ื›ื•ืชื‘ื™ื ืฉื™ื˜ื” ืฉืžื•ื—ืงืช ื‘ืื•ืคืŸ ืจืงื•ืจืกื™ื‘ื™ ืืช ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืžืงื•ื ื ื™ื. ืฉื™ื˜ื” (ื ืขืฉืชื” ื›ื”ืจื—ื‘ื”) 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 ืื• ืจืฉื™ืžื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื:

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

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

ืื ื”ืฉื“ื” ื”ื•ื RealmModel ืื• RealmList, ื”ื•ืกืฃ ืืช ื”ืื•ื‘ื™ื™ืงื˜ ืฉืœ ืฉื“ื” ื–ื” ืœืจืฉื™ืžื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืžืงื•ื ื ื™ื. ื”ื›ืœ ื‘ื“ื™ื•ืง ื›ืžื• ืฉืขืฉื™ื ื• ืœืžืขืœื”, ืจืง ืฉื›ืืŸ ื–ื” ื™ื™ืขืฉื” ืžืขืฆืžื•. ืฉื™ื˜ืช ืžื—ื™ืงืช ื”ืžืคืœ ืขืฆืžื” ื”ื™ื ืคืฉื•ื˜ื” ืžืื•ื“ ื•ื ืจืื™ืช ื›ืš:

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 ื‘ืืžืฆืขื•ืช ื”ืฉืชืงืคื•ืช, ื”ื•ื ืžื•ืฆื ืืช ื›ืœ ืื•ื‘ื™ื™ืงื˜ื™ ื”ืžืžืœื›ื” ื”ืžืงื•ื ื ื™ื ื•ืžื›ื ื™ืก ืื•ืชื ืœืจืฉื™ืžื” ืœื™ื ื™ืืจื™ืช. ื•ืื– ืื ื—ื ื• ืขื•ืฉื™ื ืืช ืื•ืชื• ื”ื“ื‘ืจ ืจืงื•ืจืกื™ื‘ื™ืช. ื‘ืขืช ื”ืžื—ื™ืงื”, ืขืœื™ืš ืœื‘ื“ื•ืง ืืช ืชืงืคื•ืช ื”ืื•ื‘ื™ื™ืงื˜ 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)
}

ื›ืชื•ืฆืื” ืžื›ืš, ื‘ืงื•ื“ ื”ืœืงื•ื— ืฉืœื ื• ืื ื• ืžืฉืชืžืฉื™ื ื‘"ืžื—ื™ืงื” ืžื“ื•ืจื’ืช" ืขื‘ื•ืจ ื›ืœ ืคืขื•ืœืช ืฉื™ื ื•ื™ ื ืชื•ื ื™ื. ืœื“ื•ื’ืžื”, ืขื‘ื•ืจ ืคืขื•ืœืช ื”ื•ืกืคื” ื–ื” ื ืจืื” ื›ืš:

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 ื ืขืœืžื• ืœื—ืœื•ื˜ื™ืŸ. ืœืื—ืจ ืฉื‘ื™ืฆืขื ื• ืืช ืื•ืชื” ืžื“ื™ื“ื” ืฉืœ ื”ืชืœื•ืช ืฉืœ ื–ืžืŸ ื”ืืชื—ื•ืœ ื‘ืžืกืคืจ ื”ื”ืชื—ืœื•ืช ื”ืงืจื•ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื”, ืื ื• ืจื•ืื™ื ืืช ื”ืชื•ืฆืื”.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ื”ืงื• ื”ื™ืจื•ืง ืžืฆื™ื’ ืืช ื”ืชืœื•ืช ืฉืœ ื–ืžืŸ ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื‘ืžืกืคืจ ื”ื”ืชื—ืœื•ืช ื”ืงืจื•ืช ื‘ืžื”ืœืš ืžื—ื™ืงืช ืžืคืœ ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืžืงื•ื ื ื™ื.

ืชื•ืฆืื•ืช ื•ืžืกืงื ื•ืช

ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ Realm ืฉื’ื“ืœ ืœืœื ื”ืจืฃ ื’ืจื ืœื™ื™ืฉื•ื ืœื”ืคืขื™ืœ ืœืื˜ ืžืื•ื“. ืคืจืกืžื ื• ืขื“ื›ื•ืŸ ืขื "ืžื—ื™ืงื” ืžื“ื•ืจื’ืช" ืžืฉืœื ื• ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืžืงื•ื ื ื™ื. ื•ืขื›ืฉื™ื• ืื ื• ืขื•ืงื‘ื™ื ื•ืžืขืจื™ื›ื™ื ื›ื™ืฆื“ ื”ื”ื—ืœื˜ื” ืฉืœื ื• ื”ืฉืคื™ืขื” ืขืœ ื–ืžืŸ ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื‘ืืžืฆืขื•ืช ื”ืžื“ื“ _app_start.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ืœืฆื•ืจืš ื ื™ืชื•ื—, ืื ื—ื ื• ืœื•ืงื—ื™ื ืคืจืง ื–ืžืŸ ืฉืœ 90 ื™ื•ื ื•ืจื•ืื™ื: ื–ืžืŸ ื”ืฉืงืช ื”ืืคืœื™ืงืฆื™ื”, ื”ืŸ ื”ื—ืฆื™ื•ืŸ ื•ื”ืŸ ื–ื” ืฉื ื•ืคืœ ืขืœ ื”ืื—ื•ื–ื•ืŸ ื”-95 ืฉืœ ื”ืžืฉืชืžืฉื™ื, ื”ื—ืœ ืœืจื“ืช ื•ืื™ื ื• ืขื•ืœื” ืขื•ื“.

ื”ืกื™ืคื•ืจ ืขืœ ืื™ืš ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ื™ืฆื—ื” ืขืœ ื”ืฉืงื” ืืจื•ื›ื”

ืื ืืชื” ืžืกืชื›ืœ ืขืœ ืชืจืฉื™ื ืฉื‘ืขืช ื”ื™ืžื™ื, ื”ืžื“ื“ _app_start ื ืจืื” ื”ื•ืœื ืœื—ืœื•ื˜ื™ืŸ ื•ื”ื•ื ืคื—ื•ืช ืžืฉื ื™ื™ื” ืื—ืช.

ื›ื“ืื™ ื’ื ืœื”ื•ืกื™ืฃ ื›ื™ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, Firebase ืฉื•ืœื— ื”ืชืจืื•ืช ืื ื”ืขืจืš ื”ื—ืฆื™ื•ื ื™ ืฉืœ _app_start ืขื•ืœื” ืขืœ 5 ืฉื ื™ื•ืช. ืื•ืœื, ื›ืคื™ ืฉืื ื• ืจื•ืื™ื, ืื™ืŸ ืœื”ืกืชืžืš ืขืœ ื›ืš, ืืœื ืœื”ื™ื›ื ืก ื•ืœื‘ื“ื•ืง ื–ืืช ื‘ืžืคื•ืจืฉ.

ื”ื“ื‘ืจ ื”ืžื™ื•ื—ื“ ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ Realm ื”ื•ื ืฉื–ื”ื• ืžืกื“ ื ืชื•ื ื™ื ืœื ื™ื—ืกื™. ืœืžืจื•ืช ืงืœื•ืช ื”ืฉื™ืžื•ืฉ ืฉืœื•, ื”ื“ืžื™ื•ืŸ ืœืคืชืจื•ื ื•ืช ORM ื•ืงื™ืฉื•ืจ ืื•ื‘ื™ื™ืงื˜ื™ื, ืื™ืŸ ืœื• ืžื—ื™ืงื” ืžื“ื•ืจื’ืช.

ืื ื–ื” ืœื ื ืœืงื— ื‘ื—ืฉื‘ื•ืŸ, ืื•ื‘ื™ื™ืงื˜ื™ื ืžืงื•ื ื ื™ื ื™ืฆื˜ื‘ืจื• ื•"ื™ื“ืœืคื•". ืžืกื“ ื”ื ืชื•ื ื™ื ื™ื’ื“ืœ ืœืœื ื”ืจืฃ, ืžื” ืฉื‘ืชื•ืจื• ื™ืฉืคื™ืข ืขืœ ื”ื”ืื˜ื” ืื• ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”.

ืฉื™ืชืคืชื™ ืืช ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื• ื›ื™ืฆื“ ืœื‘ืฆืข ื‘ืžื”ื™ืจื•ืช ืžื—ื™ืงื” ืžื“ื•ืจื’ืช ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ื‘-Realm, ืฉืขื“ื™ื™ืŸ ืœื ื™ืฆืื” ืžื”ืงื•ืคืกื”, ืื‘ืœ ื“ื•ื‘ืจ ืขืœื™ื” ื›ื‘ืจ ื”ืจื‘ื” ื–ืžืŸ ื”ื ืื•ืžืจื™ื ะธ ื”ื ืื•ืžืจื™ื. ื‘ืžืงืจื” ืฉืœื ื•, ื–ื” ื–ื™ืจื– ืžืื•ื“ ืืช ื–ืžืŸ ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”.

ืœืžืจื•ืช ื”ื“ื™ื•ืŸ ืขืœ ื”ื•ืคืขืชื• ื”ืงืจื•ื‘ื” ืฉืœ ืชื›ื•ื ื” ื–ื•, ื”ื™ืขื“ืจ ืžื—ื™ืงืช ืืฉื“ ื‘-Realm ื ืขืฉื” ืขืœ ื™ื“ื™ ืขื™ืฆื•ื‘. ืื ืืชื” ืžืขืฆื‘ ืืคืœื™ืงืฆื™ื” ื—ื“ืฉื”, ืงื— ื–ืืช ื‘ื—ืฉื‘ื•ืŸ. ื•ืื ืืชื” ื›ื‘ืจ ืžืฉืชืžืฉ ื‘-Realm, ื‘ื“ื•ืง ืื ื™ืฉ ืœืš ื‘ืขื™ื•ืช ื›ืืœื”.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”