Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Ko nga kaiwhakamahi katoa ka tere tere me te UI urupare i roto i nga tono pūkoro. Mena ka roa te tono ki te whakarewa, ka timata te kaiwhakamahi ki te pouri me te riri. Ka taea e koe te pahua i te wheako o nga kaihoko ka ngaro ranei te kaiwhakamahi ahakoa i mua i tana tiimata ki te whakamahi i te tono.

I kitea e matou he 3 hēkona te roa o te taupānga Dodo Pizza ki te whakarewa i te toharite, a mo etahi "waimarie" ka roa te 15-20 hēkona.

Kei raro iho i te tapahanga he korero me te mutunga harikoa: mo te tipuranga o te putunga raraunga Realm, he reinga mahara, me pehea e kohia ai e matou nga mea kohanga, katahi ka kumea mai, ka whakatika i nga mea katoa.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm
Kaituhi tuhinga: Maxim Kachinkin — Kaiwhakawhanake Android i Dodo Pizza.

E toru hēkona mai i te paato i te ata tono ki te onResume() o te mahi tuatahi he mutunga kore. Na mo etahi kaiwhakamahi, i tae te wa whakaoho ki te 15-20 hēkona. Me pehea e taea ai tenei?

He whakarāpopototanga tino poto mo te hunga karekau he taima ki te panui
Ko ta matou paparangi raraunga Realm i tipu mutunga kore. Ko etahi mea kohanga kaore i mukua, engari i whakaemi tonu. Ka piki haere te wa whakaoho tono. Na ka whakatikahia e matou, a ka tae mai te wa whakaoho ki te whaainga - ka iti iho i te 1 hēkona, kaore i piki ake. Kei roto i te tuhinga he tātaritanga o te ahuatanga me nga otinga e rua - he tere me te mea noa.

Te rapu me te tātari i te raru

I tenei ra, me tere te whakarewatanga o tetahi tono pūkoro me te aro. Engari ehara i te mea mo te taupānga pūkoro anake. Ko te wheako kaiwhakamahi mo te taunekeneke me tetahi ratonga me tetahi kamupene he mea uaua. Hei tauira, i roto i to maatau, ko te tere tuku tetahi o nga tohu matua mo te mahi pizza. Mena ka tere te tuku, ka wera te pizza, karekau e tatari roa te kaihoko e hiahia ana ki te kai inaianei. Mo te tono, he mea nui ki te hanga i te ahua o te ratonga tere, na te mea ka 20 hēkona noa te tono ki te whakarewatanga, ka pehea te roa e tatari ana koe mo te pizza?

I te tuatahi, i pa ki a matou ake i etahi wa ka rua hekona te tono ki te whakarewatanga, katahi ka tiimata matou ki te whakarongo amuamu a etahi atu hoa mahi mo te roa o te waa. Engari kaore i taea e matou te whakahoki tonu i tenei ahuatanga.

Kia pehea te roa? E ai ki Nga tuhinga a Google, ki te iti iho i te 5 hēkona te tiimata makariri o te tono, ka kiia tenei "mehemea he mea noa". I whakarewahia te taupānga Dodo Pizza Android (e ai ki nga inenga Firebase _app_start) i timatanga makariri i runga i te toharite i roto i te 3 hēkona - "Kare i te nui, kaore i te whakamataku," e kii ana ratou.

Engari katahi ka timata te puta o nga amuamu he roa rawa te wa ki te whakarewatanga o te tono! Hei timata, i whakatau matou ki te ine he aha te "tino, rawa, tino roa". A i whakamahia e matou te tohu Firebase mo tenei Rapu tiimata o te taupānga.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Ko tenei tohu paerewa ka ine i te wa i waenga i te wa e whakatuwhera ai te kaiwhakamahi i te tono me te wa ka mahia te onResume() o te mahi tuatahi. I roto i te Firebase Console ka kiia tenei inenga ko _app_start. I puta ko:

  • Ko nga wa whakaoho mo nga kaiwhakamahi kei runga ake i te 95 ōrau he tata ki te 20 hēkona (etahi ka roa ake), ahakoa he iti iho i te 5 hēkona te wa whakaoho makariri.
  • Ko te wa whakaoho ehara i te uara tonu, engari ka tipu haere i te waa. Engari i etahi wa he maturuturu. I kitea e matou tenei tauira i te wa i whakanuia e matou te tauine o te tātari ki te 90 ra.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

E rua nga whakaaro i puta ki te hinengaro:

  1. Kei te turuturu tetahi mea.
  2. Ko tenei "mea" ka tautuhi ano i muri i te tukunga ka pakaru ano.

"Ko tetahi mea pea me te papaa raraunga," i whakaaro matou, a he tika ta matou. Tuatahi, ka whakamahia e matou te papaaarangi hei keteroki; i te wa o te hekenga ka whakakorehia e matou. Tuarua, ka utaina te patengi raraunga ina timata te tono. He pai nga mea katoa.

He aha te he o te putunga raraunga Realm

I timata matou ki te tirotiro me pehea te whakarereketanga o nga ihirangi o te papaaarangi mo te oranga o te tono, mai i te whakaurunga tuatahi me etahi atu i te wa e whakamahia ana. Ka taea e koe te tiro i nga ihirangi o te papaunga raraunga Realm ma stetho i roto ranei i nga korero me te marama ma te whakatuwhera i te konae ma Realm Studio. Hei tiro i nga ihirangi o te papaaarangi ma te ADB, kape i te konae raraunga Realm:

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

I te titiro ki nga korero o te paataka korero i nga wa rereke, ka kitea e matou kei te piki haere tonu te maha o nga taonga o tetahi momo.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm
Ko te pikitia e whakaatu ana i tetahi kongakonga o Realm Studio mo nga konae e rua: kei te taha maui - te turanga tono mo etahi wa i muri i te whakaurunga, kei te taha matau - i muri i te whakamahinga kaha. Ka kitea te maha o nga taonga ImageEntity и MoneyType kua tino tipu haere (e whakaatu ana te Whakaahuamata i te maha o nga taonga o ia momo).

Te hononga i waenga i te tipu o te putunga korero me te wa whakaoho

He tino kino te tipu o te patengi raraunga kore whakahaere. Engari me pehea e pa ai tenei ki te wa whakaoho tono? He tino ngawari ki te ine i tenei ma te ActivityManager. Mai i te Android 4.4, ka whakaatu a logcat i te raarangi me te aho kua whakaatuhia me te waa. He rite tenei wa ki te waahi mai i te wa i whakarewahia ai te tono tae noa ki te mutunga o te whakaputa mahi. I tenei wa ka puta nga kaupapa e whai ake nei:

  • Tīmatahia te tukanga.
  • Ko te timatanga o nga mea.
  • Te waihanga me te arawhitinga o nga mahi.
  • Te hanga tahora.
  • Whakaaturanga tono.

He pai ki a maatau. Mena kei te whakahaere koe i te ADB me nga haki -S me -W, ka taea e koe te whakaputa putanga roa me te wa whakaoho:

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

Mena ka mau koe i reira grep -i WaitTime wa, ka taea e koe te whakaaunoa i te kohinga o tenei ine me te titiro ki nga hua. Ko te kauwhata i raro nei e whakaatu ana i te whakawhirinakitanga o te wa whakaoho tono ki te maha o nga timatanga makariri o te tono.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

I te wa ano, he rite tonu te ahua o te hononga i waenga i te rahi me te tipu o te putunga korero, i tipu mai i te 4 MB ki te 15 MB. I te katoa, ka puta mai i te wa (me te tipu o te makariri), ka piki ake te wa whakarewanga tono me te rahi o te papaarangi. He whakapae kei o ringaringa. Inaianei ko te mea i toe ko te whakapumau i te whakawhirinakitanga. Na reira, i whakatau matou ki te tango i nga "patu" ka kite mena ka tere ake te whakarewatanga.

Nga take mo te tipunga putunga korero mutunga kore

I mua i te tango i nga "patu", he mea tika kia maarama he aha i puta ai i te tuatahi. Ki te mahi i tenei, kia mahara tatou he aha te Realm.

Ko Realm he putunga korero-kore. Ka taea e koe te whakaahua i nga hononga i waenga i nga mea i te ahua rite ki te maha o nga papaunga hononga ORM i runga i te Android kua whakaahuahia. I te wa ano, ka penapena a Realm i nga taonga ki te mahara me te iti rawa o nga huringa me nga mapi. Ma tenei ka taea e koe te panui i nga raraunga mai i te kōpae kia tere, koinei te kaha o Realm me te aha i arohaina ai.

(Mo nga kaupapa o tenei tuhinga, ka ranea tenei whakaahuatanga ma tatou. Ka taea e koe te panui atu mo te Realm i te raumati tuhinga i roto ranei i a raatau whare wānanga).

He maha nga kaiwhakawhanake e waia ana ki te mahi nui ake me nga papaunga paaunga hononga (hei tauira, nga papaarangi ORM me te SQL i raro i te putunga). A ko nga mea penei i te whakakore i nga raraunga he maha te ahua he mea homai. Engari kaore i te Realm.

Ma te ara, kua roa te patai mo te waahanga whakakorenga cascade. Tenei whakahounga и tetahi atu, e hono ana ki a ia, i kaha te korero. I puta te whakaaro ka tata ka mahia. Engari ka whakamaoritia nga mea katoa ki te whakauru i nga hononga kaha me te ngoikore, ka whakatau aunoa i tenei raru. He tino ora, he kaha ki tenei mahi tono toia, kua whakataa mo tenei wa na nga raruraru o roto.

Te turuturu Raraunga me te kore e mukua

Me pehea te pakaru o nga raraunga mena ka whakawhirinaki koe ki te whakakore i te ruuruku kore? Mena kua kohangahia e koe nga taonga Realm, me mukua.
Kia titiro tatou ki tetahi (tata) tino tauira. He mea ta matou 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()

He rereke nga mara o te hua kei roto i te kaata, tae atu ki tetahi pikitia ImageEntity, kai whakarite CustomizationEntity. Ano, ko te hua kei roto i te kaata ka taea te whakakotahi me ona ake huinga hua RealmList (CartProductEntity). Ko nga mara kua whakarārangihia he taonga Realm. Mēnā ka kōkuhuhia he ahanoa hōu (copyToRealm() / copyToRealmOrUpdate()) me taua id, katahi ka tuhiruatia katoatia tenei ahanoa. Engari ko nga mea o roto katoa (ahua, customizationEntity me cartComboProducts) ka ngaro te hononga ki te matua ka noho tonu ki roto i te paataka raraunga.

I te mea kua ngaro te hononga ki a raatau, kaore e panuihia, ka whakakorehia ranei (mehemea ka uru atu ki a raatau, ka whakakorehia ranei te "tepu" katoa). I huaina e matou tenei ko "nga turuturu mahara".

Ka mahi tahi tatou me te Realm, me tino haere tatou ki nga huānga katoa me te whakakore i nga mea katoa i mua i aua mahi. Ka taea tenei, hei tauira, penei:

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()
}
// и потом уже сохраняем

Mena ka mahi koe i tenei, ka pai nga mea katoa kia rite ki te tikanga. I roto i tenei tauira, ka whakaaro matou karekau he ahanoa Realm kohanga i roto i te atahanga, whakaritengaEntity, me te cartComboProducts, no reira karekau he kohanga kohanga me te muku.

"Tere" otinga

Ko te mea tuatahi i whakatauhia e matou ko te horoi i nga mea tino tere te tipu me te tirotiro i nga hua ki te kite mena ka whakatauhia to maatau raru tuatahi. Tuatahi, i mahia te otinga tino ngawari me te tino mohio, ara: ma ia ahanoa te kawenga mo te tango i ana tamariki. Hei mahi i tenei, i whakauruhia e matou he atanga i whakahoki mai i te rarangi o ana taonga Realm kohanga:

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

Na ka whakatinanahia e matou ki o maatau taonga 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 ka whakahokia e matou nga tamariki katoa hei rarangi papa. Ka taea hoki e ia ahanoa tamaiti te whakamahi i te atanga NestedEntityAware, e tohu ana he ahanoa o roto o te Realm hei muku, hei tauira 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
   )
 }
}

Na ka pera ano, ka taea te whakahoki ano i te kohanga o nga taonga.

Na ka tuhia e matou he tikanga e whakakore ana i nga mea kohanga katoa. Tikanga (i hangaia hei toronga) deleteAllNestedEntities ka whiwhi i nga taonga me nga tikanga taumata-runga katoa deleteNestedRecursively Ka tangohia e ia nga mea kohanga katoa ma te whakamahi i te atanga 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()
   }
 }
}

I mahia e matou tenei me nga mea tino tere te tipu me te tirotiro i nga mea i tupu.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Ko te mutunga mai, ka mutu te tipu o nga taonga i hipokina e matou ki tenei otinga. Na ka puhoi te tipu whanui o te turanga, engari kaore i mutu.

Ko te otinga "noa".

Ahakoa i timata te tipu haere o te turanga, ka tipu tonu. Na ka timata matou ki te titiro atu. Ka tino kaha ta maatau kaupapa ki te whakamahi i te keteroki raraunga i roto i te Realm. Na reira, ko te tuhi i nga mea kohanga katoa mo ia ahanoa he tino mahi, me te tupono o nga hapa ka piki ake, na te mea ka wareware koe ki te tautuhi i nga mea ka huri i te waehere.

I hiahia ahau ki te mohio kaore au i te whakamahi i nga atanga, engari ka mahi nga mea katoa.

Ki te hiahia tatou kia mahi noa tetahi mea, me whakamahi tatou i te whakaata. Hei mahi i tenei, ka taea e tatou te haere ma ia mara karaehe me te tirotiro mena he ahanoa Realm, he rarangi taonga ranei:

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

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

Mēnā he RealmModel, RealmList rānei te āpure, kātahi ka tāpirihia te ahanoa o tēnei āpure ki te rārangi o ngā mea kohanga. He rite tonu nga mea katoa ki ta matou i korero i runga ake nei, ko konei anake ka mahia. He tino ngawari te tikanga mukunga cascade, he penei te ahua:

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

Toronga filterRealmObject ka tātari ka tukuna noa nga taonga Realm. Tikanga getNestedRealmObjects na roto i te whakaata, ka kitea e ia nga mea katoa o te whenua kua kohanga ka tuu ki roto i te rarangi rarangi. Na ka mahi tatou i te mea ano recursively. I te wa e mukua ana, me tirotiro koe mo te mana o te ahanoa isValid, na te mea tera pea ka taea e nga taonga matua rereke te noho rite. He pai ake te karo i tenei me te whakamahi noa i te hanga-aunoa o te id ina hanga mea hou.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Te whakatinanatanga katoa o te tikanga 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)
}

Ko te mutunga mai, i roto i ta maatau waehere kiritaki ka whakamahia e matou te "muku ruku" mo ia mahi whakarereke raraunga. Hei tauira, mo te mahi whakauru he penei te ahua:

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

Tikanga tuatahi getManagedEntities ka whiwhi i nga mea taapiri katoa, katahi ko te tikanga cascadeDelete Ka mukua nga mea katoa i kohia i mua i te tuhi i nga mea hou. Ka mutu taatau ki te whakamahi i tenei huarahi puta noa i te tono. Kua ngaro katoa nga maara mahara i roto i te Realm. Ka rite ano te inenga o te ti'aturi o te wa whakaoho ki te maha o nga tiimata makariri o te tono, ka kite tatou i te hua.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Ko te raina matomato e whakaatu ana i te ti'aturi o te wa whakaoho tono ki te maha o nga tiimata makariri i te wa e mukua ana nga mea kua kohanga.

Nga hua me nga whakatau

Ko te putunga raraunga Realm e tipu haere tonu ana na te tere haere o te tono. I tukuna e matou he whakahou me a maatau ake "whakamuku ruuru" o nga mea kua kohanga. Inaianei ka aro turuki, ka arotakehia i pehea te paanga o ta maatau whakatau ki te wa whakarewanga tono ma te inenga _app_start.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Mo te tātari, ka 90 nga ra ka kitea: ko te wa whakarewatanga o te tono, ko te tau waenga me tera ka taka ki te 95 ōrau o nga kaiwhakamahi, ka timata te heke, kare ano kia piki ake.

Ko te korero mo te wikitoria o te whakakore i te whakarewanga roa a Realm

Ki te titiro koe ki te tūtohi e whitu nga ra, he tino tika te inenga _app_start, he iti iho i te 1 hēkona.

He pai ano te taapiri ma te taunoa, ka tukuna e Firebase nga whakamohiotanga mena ka neke ake te uara waenga o _app_start i te 5 hēkona. Heoi, e kite ana matou, kaua e whakawhirinaki ki tenei, engari me uru ki roto ki te tirotiro maata.

Ko te mea motuhake e pa ana ki te putunga raraunga Realm ko te mea he putunga korero-kore. Ahakoa te ngawari o te whakamahi, te rite ki nga otinga ORM me te hono ahanoa, karekau he whakakorenga.

Ki te kore e whai whakaarotia, ka kohia nga mea kua kohanga ka "marere atu." Ka tipu haere tonu te patengi raraunga, ka pa ki te puhoi me te tiimata o te tono.

I whakapuakihia e au o maatau wheako me pehea te tere o te whakakore i nga taonga i roto i te Realm, kaore ano kia puta mai i te pouaka, engari kua roa te korero. e ai ta ratou и e ai ta ratou. I a maatau, na tenei i tere ake te wa whakaoho tono.

Ahakoa nga korero mo te ahua tata o tenei ahuatanga, ko te kore o te whakakorenga cascade i roto i te Realm ka mahia e te hoahoa. Mena kei te hoahoa koe i tetahi tono hou, me whai whakaaro koe ki tenei. A mena kei te whakamahi koe i te Realm, tirohia mena kei a koe nga raru penei.

Source: will.com

Tāpiri i te kōrero