Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Gikuha sa tanan nga mga tiggamit ang paspas nga paglansad ug responsive nga UI sa mga mobile application nga gihatag. Kung ang aplikasyon dugay nga maglansad, ang tiggamit magsugod nga mobati nga nasubo ug nasuko. Dali nimo madaot ang kasinatian sa kostumer o hingpit nga mawala ang tiggamit bisan sa wala pa siya magsugod sa paggamit sa aplikasyon.

Among nadiskobrehan kaniadto nga ang Dodo Pizza app nagkinahanglan og 3 segundos sa paglansad sa kasagaran, ug alang sa pipila ka mga "swerte" nagkinahanglan kini og 15-20 segundos.

Ubos sa pagputol mao ang usa ka istorya nga adunay malipayon nga katapusan: bahin sa pagtubo sa database sa Realm, usa ka pagtulo sa panumduman, kung giunsa namon natipon ang mga salag nga mga butang, ug dayon gibira ang among kaugalingon ug giayo ang tanan.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog
tagsulat sa artikulo: Maxim Kachinkin β€” Android developer sa Dodo Pizza.

Tulo ka segundos gikan sa pag-klik sa icon sa aplikasyon ngadto sa onResume() sa unang kalihokan mao ang infinity. Ug alang sa pipila nga mga tiggamit, ang oras sa pagsugod miabot sa 15-20 segundos. Sa unsang paagi kini posible?

Usa ka mubo kaayo nga summary alang niadtong walay panahon sa pagbasa
Ang among database sa Realm mitubo nga walay katapusan. Ang ubang mga salag nga mga butang wala mapapas, apan kanunay nga natipon. Ang oras sa pagsugod sa aplikasyon hinayhinay nga nadugangan. Pagkahuman giayo namon kini, ug ang oras sa pagsugod miabot sa target - nahimo kini nga wala’y 1 segundos ug wala na pagtaas. Ang artikulo naglangkob sa usa ka pagtuki sa sitwasyon ug duha ka solusyon - usa ka dali ug usa ka normal.

Pagpangita ug pagtuki sa problema

Karon, ang bisan unsang mobile application kinahanglan nga dali nga maglansad ug mahimong responsive. Apan dili lang kini bahin sa mobile app. Ang kasinatian sa tiggamit sa interaksyon sa usa ka serbisyo ug usa ka kompanya usa ka komplikado nga butang. Pananglitan, sa among kaso, ang katulin sa pagpadala usa sa mga hinungdan nga timailhan alang sa serbisyo sa pizza. Kung paspas ang pagpadala, init ang pizza, ug ang kustomer nga gusto mokaon karon dili na maghulat ug dugay. Alang sa aplikasyon, sa baylo, hinungdanon nga maghimo usa ka pagbati sa paspas nga serbisyo, tungod kay kung ang aplikasyon molungtad lamang sa 20 segundos aron ilunsad, nan unsa ka dugay nga maghulat ka alang sa pizza?

Sa sinugdan, kami mismo nag-atubang sa kamatuoran nga usahay ang aplikasyon nagkinahanglan og pipila ka mga segundo aron ilunsad, ug dayon kami nagsugod sa pagkadungog sa mga reklamo gikan sa ubang mga kauban mahitungod sa unsa ka dugay kini gikuha. Apan wala na namo masubli kini nga sitwasyon.

Unsa ka dugay kini? Sumala sa Dokumentasyon sa Google, kung ang usa ka bugnaw nga pagsugod sa usa ka aplikasyon dili moubos sa 5 segundos, nan kini giisip nga "ingon nga normal". Gilunsad ang Dodo Pizza Android app (sumala sa mga sukatan sa Firebase _app_start) sa bugnaw nga pagsugod sa kasagaran sa 3 segundos - "Dili maayo, dili makalilisang," ingon sa ilang giingon.

Apan unya ang mga reklamo nagsugod sa pagpakita nga ang aplikasyon gikuha sa usa ka kaayo, kaayo, kaayo nga panahon sa paglansad! Sa pagsugod, nakahukom kami nga sukdon kung unsa ang "very, very, very long". Ug gigamit namon ang pagsubay sa Firebase alang niini Pagsubay sa pagsugod sa app.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Kini nga sumbanan nga pagsubay nagsukod sa oras tali sa higayon nga giablihan sa user ang aplikasyon ug sa higayon nga ang onResume() sa unang kalihokan gipatuman. Sa Firebase Console kini nga sukdanan gitawag og _app_start. Kini nahimo nga:

  • Ang mga oras sa pagsugod alang sa mga tiggamit nga labaw sa 95th percentile hapit 20 segundos (ang uban mas taas pa), bisan pa sa median nga bugnaw nga oras sa pagsugod nga wala’y 5 segundos.
  • Ang oras sa pagsugod dili kanunay nga kantidad, apan motubo sa paglabay sa panahon. Apan usahay adunay mga tulo. Nakaplagan namo kini nga sumbanan sa dihang among gipadako ang sukod sa pagtuki ngadto sa 90 ka adlaw.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Duha ka hunahuna ang misantop sa akong hunahuna:

  1. Adunay nag-leak.
  2. Kini nga "usa ka butang" gi-reset human sa pagpagawas ug dayon pagtulo pag-usab.

"Tingali usa ka butang nga adunay database," naghunahuna kami, ug husto kami. Una, gigamit namon ang database ingon usa ka cache; sa panahon sa paglalin among gilimpyohan kini. Ikaduha, ang database gikarga kung magsugod ang aplikasyon. Ang tanan mohaum.

Unsa ang sayup sa database sa Realm

Nagsugod kami sa pagsusi kung giunsa ang pagbag-o sa sulud sa database sa kinabuhi sa aplikasyon, gikan sa una nga pag-install ug labi pa sa panahon sa aktibo nga paggamit. Mahimo nimong tan-awon ang mga sulud sa database sa Realm pinaagi sa stetho o sa mas detalyado ug klaro pinaagi sa pag-abli sa file pinaagi sa Realm Studio. Aron makita ang mga sulod sa database pinaagi sa ADB, kopyaha ang Realm database file:

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

Sa pagtan-aw sa mga sulud sa database sa lainlaing mga panahon, nahibal-an namon nga ang gidaghanon sa mga butang sa usa ka piho nga tipo kanunay nga nagdugang.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog
Ang hulagway nagpakita sa usa ka tipik sa Realm Studio alang sa duha ka mga file: sa wala - ang base sa aplikasyon pipila ka panahon human sa pag-instalar, sa tuo - human sa aktibong paggamit. Kini makita nga ang gidaghanon sa mga butang ImageEntity ΠΈ MoneyType mitubo pag-ayo (ang screenshot nagpakita sa gidaghanon sa mga butang sa matag matang).

Relasyon tali sa pagtubo sa database ug oras sa pagsugod

Ang dili makontrol nga pagtubo sa database daotan kaayo. Apan sa unsang paagi kini makaapekto sa oras sa pagsugod sa aplikasyon? Sayon ra ang pagsukod niini pinaagi sa ActivityManager. Sukad sa Android 4.4, gipakita sa logcat ang log gamit ang string nga Gipakita ug ang oras. Kini nga oras katumbas sa agwat gikan sa pagsugod sa aplikasyon hangtod sa katapusan sa paghubad sa kalihokan. Niini nga panahon ang mosunod nga mga panghitabo mahitabo:

  • Sugdi ang proseso.
  • Initialization sa mga butang.
  • Pagmugna ug pagsugod sa mga kalihokan.
  • Paghimo og layout.
  • Paghubad sa aplikasyon.

Nahiangay kanato. Kung gipadagan nimo ang ADB gamit ang -S ug -W nga mga bandera, mahimo nimong makuha ang taas nga output sa oras sa pagsugod:

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

Kung kuhaon nimo kini gikan didto grep -i WaitTime oras, mahimo nimong awtomatiko ang pagkolekta niini nga sukatan ug tan-awon nga makita ang mga resulta. Ang graph sa ubos nagpakita sa pagsalig sa oras sa pagsugod sa aplikasyon sa gidaghanon sa bugnaw nga pagsugod sa aplikasyon.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Sa samang higayon, adunay parehas nga kinaiya sa relasyon tali sa gidak-on ug pagtubo sa database, nga mitubo gikan sa 4 MB ngadto sa 15 MB. Sa kinatibuk-an, kini nahimo nga sa paglabay sa panahon (uban ang pagtubo sa katugnaw nagsugod), ang oras sa paglansad sa aplikasyon ug ang gidak-on sa database nadugangan. Kami adunay hypothesis sa among mga kamot. Karon ang nahabilin mao ang pagkumpirma sa pagsalig. Busa, nakahukom kami nga tangtangon ang "mga pagtulo" ug tan-awon kung kini makapadali sa paglansad.

Mga hinungdan sa walay katapusan nga pagtubo sa database

Sa wala pa tangtangon ang "mga pagtulo", angay nga masabtan kung ngano nga kini nagpakita sa una. Aron mahimo kini, atong hinumdoman kung unsa ang Realm.

Ang Realm usa ka non-relational database. Gitugotan ka niini nga ihulagway ang mga relasyon tali sa mga butang sa parehas nga paagi kung pila ang ORM relational database sa Android nga gihulagway. Sa parehas nga oras, gitipigan sa Realm ang mga butang nga direkta sa memorya nga adunay labing gamay nga gidaghanon sa mga pagbag-o ug mga mapa. Kini nagtugot kanimo sa pagbasa sa mga datos gikan sa disk nga dali kaayo, nga mao ang kalig-on sa Realm ug nganong kini gihigugma.

(Alang sa mga katuyoan niini nga artikulo, kini nga paghulagway igo na alang kanamo. Mahimo nimong mabasa ang dugang bahin sa Realm sa cool dokumentasyon o sa ilang akademya).

Daghang mga developer ang naanad sa pagtrabaho og dugang sa mga relational database (pananglitan, ang mga database sa ORM nga adunay SQL ubos sa hood). Ug ang mga butang sama sa pagtangtang sa data sa cascading kanunay ingon usa ka gihatag. Pero dili sa Realm.

Pinaagi sa dalan, ang bahin sa pagtangtang sa cascade dugay nang gipangutana. Kini rebisyon ΠΈ lain pa, nakig-uban niini, aktibong gihisgutan. Adunay usa ka pagbati nga kini sa dili madugay mahuman. Apan unya ang tanan gihubad ngadto sa pagpaila sa lig-on ug huyang nga mga link, nga awtomatiko usab nga makasulbad niini nga problema. Madasigon ug aktibo niini nga buluhaton hangyo sa pagbitad, nga nahunong sa pagkakaron tungod sa internal nga mga kalisdanan.

Ang pagtulo sa datos nga wala’y pagtangtang sa kaskad

Unsa man gyud ang pagtulo sa data kung nagsalig ka sa usa ka wala nga pagtangtang sa cascading? Kung ikaw adunay mga salag nga mga butang sa Realm, kinahanglan kini nga mapapas.
Atong tan-awon ang usa ka (halos) tinuod nga pananglitan. Kami adunay usa ka butang 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()

Ang produkto sa cart adunay lain-laing mga field, lakip ang usa ka hulagway ImageEntity, gipahiangay nga mga sangkap CustomizationEntity. Usab, ang produkto sa kariton mahimo nga usa ka combo nga adunay kaugalingon nga hugpong sa mga produkto RealmList (CartProductEntity). Ang tanan nga nalista nga mga natad mga butang sa Realm. Kung magsal-ot kami ug bag-ong butang (copyToRealm() / copyToRealmOrUpdate()) nga adunay parehas nga id, nan kini nga butang hingpit nga ma-overwrite. Apan ang tanan nga internal nga mga butang (larawan, customizationEntity ug cartComboProducts) mawad-an sa koneksyon sa ginikanan ug magpabilin sa database.

Tungod kay ang koneksyon uban kanila nawala, dili na namo kini basahon o tangtangon (gawas lang kon kami tin-aw nga nag-access niini o nag-clear sa tibuok "table"). Gitawag namo kini nga "memory leaks".

Kung nagtrabaho kami kauban ang Realm, kinahanglan namon nga klaro nga susihon ang tanan nga mga elemento ug klaro nga papason ang tanan sa wala pa ang ingon nga mga operasyon. Mahimo kini, pananglitan, sama niini:

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()
}
// ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ сохраняСм

Kung buhaton nimo kini, nan ang tanan molihok ingon nga kini kinahanglan. Sa kini nga pananglitan, among gihunahuna nga wala’y uban pang mga nested Realm nga mga butang sa sulod sa imahe, customizationEntity, ug cartComboProducts, mao nga wala nay ubang mga nested loops ug deletes.

"Dali" nga solusyon

Ang una nga butang nga among nadesisyonan nga buhaton mao ang paglimpyo sa labing paspas nga pagtubo nga mga butang ug susiha ang mga resulta aron makita kung kini makasulbad sa among orihinal nga problema. Una, gihimo ang pinakasimple ug labing intuitive nga solusyon, nga mao: ang matag butang kinahanglan nga responsable sa pagtangtang sa mga anak niini. Aron mahimo kini, gipaila namo ang usa ka interface nga nagbalik sa usa ka lista sa mga salag nga mga butang sa Realm:

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

Ug gipatuman namo kini sa among Realm objects:

@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 gibalik namo ang tanang mga bata isip usa ka patag nga listahan. Ug ang matag butang sa bata mahimo usab nga ipatuman ang interface sa NestedEntityAware, nga nagpakita nga kini adunay internal nga mga butang sa Realm nga papason, pananglitan 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
   )
 }
}

Ug uban pa, ang pagsabwag sa mga butang mahimong masubli.

Dayon nagsulat kami og pamaagi nga recursively delete sa tanang nested objects. Pamaagi (gihimo isip extension) deleteAllNestedEntities Nakuha ang tanan nga top-level nga mga butang ug pamaagi deleteNestedRecursively Balikbalik nga tangtangon ang tanang nested object gamit ang NestedEntityAware interface:

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

Gibuhat namo kini sa labing paspas nga pagtubo nga mga butang ug gisusi kung unsa ang nahitabo.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Ingon usa ka sangputanan, ang mga butang nga among gitabonan sa kini nga solusyon mihunong sa pagtubo. Ug ang kinatibuk-ang pagtubo sa base hinay, apan wala mohunong.

Ang "normal" nga solusyon

Bisan tuod ang base nagsugod sa pagtubo nga mas hinay, kini mitubo gihapon. Busa nagsugod kami sa pagpangita sa dugang. Ang among proyekto naghimo sa aktibo nga paggamit sa data caching sa Realm. Busa, ang pagsulat sa tanan nga mga nested nga mga butang alang sa matag butang mao ang labor-intensive, ug ang risgo sa mga kasaypanan nagdugang, tungod kay mahimo nimong kalimtan ang pagtino sa mga butang kung mag-usab sa code.

Gusto nako nga masiguro nga wala ako mogamit mga interface, apan ang tanan nagtrabaho sa kaugalingon.

Kung gusto naton ang usa ka butang nga molihok sa kaugalingon, kinahanglan naton gamiton ang pagpamalandong. Aron mahimo kini, makaagi kita sa matag field sa klase ug susihon kung kini ba usa ka Realm nga butang o usa ka lista sa mga butang:

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

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

Kung ang uma usa ka RealmModel o RealmList, unya idugang ang butang niini nga uma sa usa ka lista sa mga salag nga mga butang. Ang tanan parehas ra sa among gibuhat sa taas, dinhi ra kini buhaton sa iyang kaugalingon. Ang pamaagi sa pagtangtang sa cascade mismo yano ra kaayo ug ingon niini:

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

Extension filterRealmObject nagsala ug nagpasa lamang sa mga butang sa Realm. Pamaagi getNestedRealmObjects pinaagi sa pagpamalandong, nakit-an niini ang tanan nga mga salag nga mga butang sa Realm ug gibutang kini sa usa ka linear nga lista. Dayon atong buhaton ang samang butang nga balikbalik. Kung nagtangtang, kinahanglan nimo nga susihon ang butang alang sa pagkabalido isValid, tungod kay mahimo nga ang lainlaing mga butang sa ginikanan mahimong adunay managsama nga mga salag. Mas maayo nga likayan kini ug gamiton lang ang auto-generation of id sa paghimo og bag-ong mga butang.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Bug-os nga pagpatuman sa getNestedRealmObjects nga pamaagi

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

Isip resulta, sa among client code among gigamit ang "cascading delete" para sa matag data modification operation. Pananglitan, alang sa usa ka insert nga operasyon kini ingon niini:

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

Pamaagi una getManagedEntities makadawat sa tanan nga dugang nga mga butang, ug dayon ang pamaagi cascadeDelete Balikbalik nga gitangtang ang tanan nga nakolekta nga mga butang sa wala pa magsulat og mga bag-o. Gitapos namon ang paggamit niini nga pamaagi sa tibuuk nga aplikasyon. Ang mga pagtulo sa memorya sa Realm hingpit nga nawala. Ang pagpahigayon sa parehas nga pagsukod sa pagsalig sa oras sa pagsugod sa gidaghanon sa bugnaw nga pagsugod sa aplikasyon, nakita namon ang resulta.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Gipakita sa berdeng linya ang pagsalig sa oras sa pagsugod sa aplikasyon sa gidaghanon sa bugnaw nga pagsugod sa panahon sa awtomatikong pagtangtang sa cascade sa mga salag nga mga butang.

Mga resulta ug konklusyon

Ang kanunay nga nagtubo nga database sa Realm nagpahinabo sa aplikasyon sa paglansad sa hinay kaayo. Nagpagawas kami og update sa among kaugalingong "cascading delete" sa mga nested objects. Ug karon among gimonitor ug gitimbang-timbang kung giunsa ang among desisyon nakaapekto sa oras sa pagsugod sa aplikasyon pinaagi sa _app_start metric.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Alang sa pag-analisar, mogahin kami ug yugto sa panahon nga 90 ka adlaw ug tan-awa: ang oras sa paglansad sa aplikasyon, ang median ug ang nahulog sa ika-95 nga porsyento sa mga tiggamit, nagsugod sa pagkunhod ug wala na pagtaas.

Ang istorya kung giunsa ang pagtangtang sa cascading sa dugay nga paglansad sa Realm nakadaog

Kung imong tan-awon ang pito ka adlaw nga tsart, ang _app_start metric tan-awon nga hingpit nga igo ug wala’y 1 segundos.

Angayan usab nga idugang nga pinaagi sa default, ang Firebase nagpadala mga pahibalo kung ang median nga kantidad sa _app_start molapas sa 5 segundos. Bisan pa, ingon sa among nakita, dili ka kinahanglan magsalig niini, apan adto ug susihon kini nga klaro.

Ang espesyal nga butang bahin sa database sa Realm mao nga kini usa ka non-relational database. Bisan pa sa kadali sa paggamit niini, pagkaparehas sa mga solusyon sa ORM ug pag-link sa butang, wala kini pagtangtang sa kaskad.

Kung dili kini tagdon, nan ang mga salag nga mga butang magtigum ug "mag-agas". Ang database motubo kanunay, nga sa baylo makaapekto sa paghinay o pagsugod sa aplikasyon.

Gipaambit nako ang among kasinatian kung giunsa ang dali nga paghimo sa usa ka cascade nga pagtangtang sa mga butang sa Realm, nga wala pa sa gawas sa kahon, apan gihisgutan sa dugay nga panahon isulti ΠΈ isulti. Sa among kaso, gipadali niini ang oras sa pagsugod sa aplikasyon.

Bisan pa sa panaghisgot bahin sa nagkaduol nga dagway sa kini nga bahin, ang pagkawala sa cascade nga pagtangtang sa Realm gihimo pinaagi sa laraw. Kung nagdesinyo ka usa ka bag-ong aplikasyon, hunahunaa kini. Ug kung naggamit ka na sa Realm, susiha kung naa ka sa ingon nga mga problema.

Source: www.habr.com

Idugang sa usa ka comment