ืื ืืืฉืชืืฉืื ืืืงืืื ืืช ืืืฉืงื ืืืืืจื ืืืืฉืง ืืืฉืชืืฉ ืืืืื ืืืคืืืงืฆืืืช ืื ืืื ืืืืื ืื ืืืืืื. ืื ืืืคืืืงืฆืื ืืืงื ืืจืื ืืื ืืืคืขืื, ืืืฉืชืืฉ ืืชืืื ืืืจืืืฉ ืขืฆืื ืืืขืก. ืืชื ืืืื ืืงืืืช ืืงืืงื ืืช ืืืืืช ืืืงืื ืื ืืืื ืืืืืืื ืืช ืืืฉืชืืฉ ืขืื ืืคื ื ืฉืืื ืืชืืื ืืืฉืชืืฉ ืืืคืืืงืฆืื.
ืืืืื ื ืคืขื ืฉืืืคืืืงืฆืื Dodo Pizza ืืืงื 3 ืฉื ืืืช ืืืคืขืื ืืืืืฆืข, ืืืืื "ืืจื ืืื" ืื ืืืงื 15-20 ืฉื ืืืช.
ืืชืืช ืืืืชืื ืืฉ ืกืืคืืจ ืขื ืกืืฃ ืืื: ืขื ืฆืืืืช ืืกื ืื ืชืื ืื ืฉื ื-Realm, ืืืืคืช ืืืืจืื, ืืื ืฆืืจื ื ืืืืืืงืืื ืืงืื ื ืื, ืืื ืืชืืืื ื ืืชืืงื ื ืืื.
ืืืืจ ืืืืืจ:ืืงืกืื ืงืฆ'ืื ืงืื - ืืคืชื ืื ืืจืืืื ื-Dodo Pizza.
ืฉืืืฉ ืฉื ืืืช ืืืืืฆื ืขื ืกืื ืืืคืืืงืฆืื ื-onResume() ืฉื ืืคืขืืืืช ืืจืืฉืื ื ืื ืืื ืกืืฃ. ืืขืืืจ ืืืง ืืืืฉืชืืฉืื, ืืื ืืืคืขืื ืืืืข ื-15-20 ืฉื ืืืช. ืืื ืื ืืืื ืืคืฉืจื?
ืชืงืฆืืจ ืงืฆืจ ืืืื ืืื ืฉืืื ืื ืืื ืืงืจืื
ืืกื ืื ืชืื ืื ืฉื ืืืืืื ืฉืื ื ืืื ืืื ืกืืฃ. ืืืง ืืืืืืืืงืืื ืืืงืื ื ืื ืื ื ืืืงื, ืืื ืืฆืืืจื ืื ืืืื. ืืื ืืืคืขืื ืฉื ืืืคืืืงืฆืื ืืื ืืืืจืื. ืืืจ ืื ืชืืงื ื ืืช ืื, ืืืื ืืืชืืื ืืืืข ืืืขื - ืืื ืืคื ืคืืืช ืืฉื ืืื ืืืช ืืื ืืื ืขืื. ืืืืืจ ืืืื ื ืืชืื ืืืฆื ืืฉื ื ืคืชืจืื ืืช - ืืืืจ ืืจืืื.
ืืืคืืฉ ืื ืืชืื ืืืขืื
ืืืื, ืื ืืคืืืงืฆืื ืื ืืื ืืืืืช ืืืฉืืง ืืืืืจืืช ืืืืืืช ืจืกืคืื ืกืืืืช. ืืื ืื ืื ืงืฉืืจ ืจืง ืืืคืืืงืฆืื ืื ืืื. ืืืืืช ืืฉืชืืฉ ืฉื ืืื ืืจืืงืฆืื ืขื ืฉืืจืืช ืืืืจื ืืื ืืืจ ืืืจืื. ืืืืืื, ืืืงืจื ืฉืื ื, ืืืืจืืช ืืืฉืืื ืืื ืืื ืืืืืื ืืืจืืืืื ืืฉืืจืืช ืคืืฆื. ืื ืืืฉืืื ืืืื ืืืืจ ืืคืืฆื ืชืืื ืืื, ืืืืงืื ืฉืจืืฆื ืืืืื ืขืืฉืื ืื ืืฆืืจื ืืืืืช ืืจืื. ืืืคืืืงืฆืื, ืืชืืจื, ืืฉืื ืืืฆืืจ ืชืืืฉื ืฉื ืฉืืจืืช ืืืืจ, ืื ืื ืืืคืืืงืฆืื ืืืงื ืจืง 20 ืฉื ืืืช ืืืฉืืง, ืื ืืื ืืื ืชืฆืืจืื ืืืืืช ืืคืืฆื?
ืืืชืืื, ืื ืื ื ืขืฆืื ื ืขืืื ื ืืคื ื ืืขืืืื ืฉืืคืขืืื ืืืคืืืงืฆืื ืืงืื ืืื ืฉื ืืืช ืืืคืขืื, ืืื ืืชืืื ื ืืฉืืืข ืชืืื ืืช ืืขืืืชืื ืืืจืื ืขื ืืื ืืื ืื ืืงื. ืืื ืื ืืฆืืื ื ืืืืืจ ืขื ืืืฆื ืืื ืืืืคื ืขืงืื.
ืืื ืืจืื ืื? ืืคื
ืืื ืื ืืชืืืื ืืืืคืืข ืชืืื ืืช ืขื ืื ืฉืืืคืืืงืฆืื ืืงืื ืืจืื ืืืื ืืืื ืืื ืืืฉืืง! ืืืืชืืืื ืืืืื ื ืืืืื ืื ืื "ืืืื, ืืืื, ืืืื ืืจืื". ืืืฉืชืืฉื ื ื-Firebase Trace ืืฉืืื ืื
ืืขืงื ืกืื ืืจืื ืื ืืืื ืืช ืืืื ืืื ืืจืืข ืฉืื ืืืฉืชืืฉ ืคืืชื ืืช ืืืคืืืงืฆืื ืืขื ืืจืืข ืืืฆืืข onResume() ืฉื ืืคืขืืืืช ืืจืืฉืื ื. ื-Firebase Console ืืืื ืืื ื ืงืจื _app_start. ืืชืืจืจ ืฉ:
- ืืื ื ืืืชืืื ืฉื ืืฉืชืืฉืื ืืขื ืืืืืืื ื-95 ืื ืืืขื 20 ืฉื ืืืช (ืืืงื ืืฃ ืืจืืืื ืืืชืจ), ืืืจืืช ืฉืืื ืืืชืืื ืืงืจ ืืืฆืืื ื ืืื ืคืืืช ื-5 ืฉื ืืืช.
- ืืื ืืืคืขืื ืืื ื ืขืจื ืงืืืข, ืืื ืืื ืขื ืืืื. ืืื ืืคืขืืื ืืฉ ืืืคืืช. ืืฆืื ื ืืคืืก ืื ืืฉืืืืื ื ืืช ืกืืื ืื ืืชืื ื-90 ืืืื.
ืฉืชื ืืืฉืืืช ืขืื ืืจืืฉ:
- ืืฉืื ืืืืฃ.
- ื"ืืฉืื" ืืื ืืชืืคืก ืืืืจ ืืฉืืจืืจ ืืื ืืืืฃ ืฉืื.
"ืื ืจืื ืืฉืื ืขื ืืกื ืื ืชืื ืื", ืืฉืื ื ืืฆืืงื ื. ืจืืฉืืช, ืื ื ืืฉืชืืฉืื ืืืกื ืื ืชืื ืื ืืืืืื; ืืืืื ืืืืืจื ืื ื ืื ืงืื ืืืชื. ืฉื ืืช, ืืกื ืื ืชืื ืื ื ืืขื ืืืฉืจ ืืืืฉืื ืืชืืื. ืืื ืืฉืชืื ืืืื.
ืื ืจืข ืืืกื ืื ืชืื ืื ืฉื Realm
ืืชืืื ื ืืืืืง ืืืฆื ืืฉืชื ื ืืชืืื ืฉื ืืกืืก ืื ืชืื ืื ืืืืื ืืื ืืืคืืืงืฆืื, ืืืืชืงื ื ืืจืืฉืื ื ืืืืืฉื ืืืืื ืืฉืืืืฉ ืืคืขืื. ืืชื ืืืื ืืืฆืื ืืช ืืชืืื ืฉื ืืกื ืื ืชืื ืื ืฉื ืืืืืื ืืจื
adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME}
ืืืืจ ืฉืืืงื ื ืืช ืชืืื ืืกื ืื ืชืื ืื ืืืื ืื ืฉืื ืื, ืืืืื ื ืฉืืกืคืจ ืืืืืืืงืืื ืืกืื ืืกืืื ืืื ืื ืืืื.
ืืชืืื ื ืืฆืืื ืงืืข ืฉื 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
ืืื, ืืชื ืืืื ืืืคืื ืืช ืืืกืืฃ ืืืื ืืื ืืืืืืืื ืืืืกืชืื ืืืืชืืช ืขื ืืชืืฆืืืช. ืืืจืฃ ืฉืืืื ืืฆืื ืืช ืืชืืืช ืฉื ืืื ืืืคืขืื ืฉื ืืืคืืืงืฆืื ืืืกืคืจ ืืืชืืืืช ืืงืจืืช ืฉื ืืืคืืืงืฆืื.
ืืื ืขื ืืืช, ืืื ืืืชื ืืืคื ืฉื ืืงืฉืจ ืืื ืืืื ืืฆืืืื ืฉื ืืกืืก ืื ืชืื ืื, ืฉืฆืื ื-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 ืื ืจืฉืืื ืฉื ืืืืืืงืืื:
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
, ืืืืืื ืฉืืืื ืืืืืช ืฉืืืืืืืงืื ืื ืฉืื ืื ืืืืืื ืืืืืช ืืืืืืงืืื ืืืื ืืงืื ื ืื. ืขืืืฃ ืืืืื ืข ืืื ืืคืฉืื ืืืฉืชืืฉ ืืืฆืืจื ืืืืืืืืช ืฉื ืืืื ืืขืช ืืฆืืจืช ืืืืืืงืืื ืืืฉืื.
ืืืฉืื ืืื ืฉื ืฉืืืช 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 ืฉืืื ืืื ืืจืฃ ืืจื ืืืืฉืื ืืืคืขืื ืืื ืืืื. ืคืจืกืื ื ืขืืืื ืขื "ืืืืงื ืืืืจืืช" ืืฉืื ื ืฉื ืืืืืืงืืื ืืงืื ื ืื. ืืขืืฉืื ืื ื ืขืืงืืื ืืืขืจืืืื ืืืฆื ืืืืืื ืฉืื ื ืืฉืคืืขื ืขื ืืื ืืืคืขืื ืฉื ืืืคืืืงืฆืื ืืืืฆืขืืช ืืืื _app_start.
ืืฆืืจื ื ืืชืื, ืื ืื ื ืืืงืืื ืคืจืง ืืื ืฉื 90 ืืื ืืจืืืื: ืืื ืืฉืงืช ืืืคืืืงืฆืื, ืื ืืืฆืืื ืืื ืื ืฉื ืืคื ืขื ืืืืืืื ื-95 ืฉื ืืืฉืชืืฉืื, ืืื ืืจืืช ืืืื ื ืขืืื ืขืื.
ืื ืืชื ืืกืชืื ืขื ืชืจืฉืื ืฉืืขืช ืืืืื, ืืืื _app_start ื ืจืื ืืืื ืืืืืืื ืืืื ืคืืืช ืืฉื ืืื ืืืช.
ืืืื ืื ืืืืกืืฃ ืื ืืืจืืจืช ืืืื, Firebase ืฉืืื ืืชืจืืืช ืื ืืขืจื ืืืฆืืื ื ืฉื _app_start ืขืืื ืขื 5 ืฉื ืืืช. ืืืื, ืืคื ืฉืื ื ืจืืืื, ืืื ืืืกืชืื ืขื ืื, ืืื ืืืืื ืก ืืืืืืง ืืืช ืืืคืืจืฉ.
ืืืืจ ืืืืืื ืืืกื ืื ืชืื ืื ืฉื Realm ืืื ืฉืืื ืืกื ื ืชืื ืื ืื ืืืกื. ืืืจืืช ืงืืืช ืืฉืืืืฉ ืฉืื, ืืืืืื ืืคืชืจืื ืืช ORM ืืงืืฉืืจ ืืืืืืงืืื, ืืื ืื ืืืืงื ืืืืจืืช.
ืื ืื ืื ื ืืงื ืืืฉืืื, ืืืืืืงืืื ืืงืื ื ืื ืืฆืืืจื ื"ืืืืคื". ืืกื ืื ืชืื ืื ืืืื ืืื ืืจืฃ, ืื ืฉืืชืืจื ืืฉืคืืข ืขื ืืืืื ืื ืืืคืขืื ืฉื ืืืคืืืงืฆืื.
ืฉืืชืคืชื ืืช ืื ืืกืืื ืฉืื ื ืืืฆื ืืืฆืข ืืืืืจืืช ืืืืงื ืืืืจืืช ืฉื ืืืืืืงืืื ื-Realm, ืฉืขืืืื ืื ืืฆืื ืืืงืืคืกื, ืืื ืืืืจ ืขืืื ืืืจ ืืจืื ืืื
ืืืจืืช ืืืืื ืขื ืืืคืขืชื ืืงืจืืื ืฉื ืชืืื ื ืื, ืืืขืืจ ืืืืงืช ืืฉื ื-Realm ื ืขืฉื ืขื ืืื ืขืืฆืื. ืื ืืชื ืืขืฆื ืืคืืืงืฆืื ืืืฉื, ืงื ืืืช ืืืฉืืื. ืืื ืืชื ืืืจ ืืฉืชืืฉ ื-Realm, ืืืืง ืื ืืฉ ืื ืืขืืืช ืืืื.
ืืงืืจ: www.habr.com