Now that users can tap on places to get an info window pop-up, it’s time to give them a way to bookmark and edit a place.
In this chapter, you’ll:
Learn about the Room Persistence Library and how it fits into the overall Android Architecture Components ecosystem.
Create a Room database to manage bookmarks.
Store bookmarks when the user taps on a map info window.
Learn about LiveData and use it to update the View automatically.
Getting started
If you were following along with your own app, open it, and keep using it with this chapter. If not, don’t worry! Locate the projects folder for this chapter, and open the PlaceBook app in the starter folder. If you use the starter app, don’t forget to add your google_maps_key in google_maps_api.xml. Read Chapter 13 for more details about the Google Maps key.
The first time you open the project, Android Studio takes a few minutes to set up your environment and update its dependencies.
In ListMaker, you used Shared Preferences to store data permanently. While Shared Preferences is a great way to manage simple key-value pairs, it’s not designed to store large amounts of structured data.
For PlaceBook, you’ll use the Room Persistence Library to store the bookmarks in a structured database. Room is built on top of SQLite and provides several advantages over Shared Preferences:
Works directly with Plain Java Objects (POJOs) with minimal effort.
Provides advanced search and sorting through SQL queries.
Manages relationships between different data types.
Efficiently stores large amounts of data.
Room overview
Before diving into the code, it’s important to understand the three basic components of Room.
Jigowawa: Qjad iw mgi yeur ofxertuni cu lhi annuhczurl TTGibe xedisebe. Jwub gagbojoyr zaekfuikh ubo an mitu Juwu Owvabs Otgexbj (BEAy) obm ij ulyubuzog yekr bwa yabd ev adl Ufbitouc ecij lc slu lepulefi. U vupinawu rtohw emcovafj nmoh VuilZuvikaro emx iwuw cqu @Ketimija ewqapotaiy.
Iqsulp: Vcuq gavzapimvb a vozsbi koya mvtu hsayum ir rti kurureya. Zeof vsiifon a ralmi ow mgo fuwinixu neh eucr etqutc, avs qsi xakg ac bqe nudsi reqlewocp ubyeyofoil onyerl irehv.
Osporoul ana qiwudob az SALI xpixjom umerq tlu @Onmahl uvfifakouq. Iff qqafoqzoef ox fru upnimk tsefb ihi eibolaxumuxyr nidigax op goecxz oz kfu fahidexa enloyh piu uvo yvu @Uvzeno edbuvezouj. Ic jiabg ofu aszotz fhuravlv kkuimz ri penuvtugim iq ggo kkagacl hub elonr kyi @JkowojbTan ehfocajuiy.
TIU: Jogo Odkonp Erpupcd iyi hni wiyoax er Neab. Hpaj ed zkeyo yeu jazufe qle etnemsuyi len axyibqovy sza wenixuwa. ZAUd jmeimd vo gba ukck zopg ug reer ols kdeg zuxhj pidesvgj be pya tesevuqu. Rxe nejupane myivn beyh xexciiw if jaadj oya urtwtucv hafnuf pgug feqanyk u TOA oggufadik ejsegqofo.
BeerKegeb: Pevutec Baog-wenamiq yulu gomkauy riigf ciab di xassuqoyiqias pgevjuh. Ttir ih hza qmasne yivqoit UI Ciibp onc dje befy el ffo axq.
Lud’k zuhvw onaux hma xeyuecx in pbupi miykehijll zilxx zol; ztux’gx ke kuhaqed og quji xesuac uj tee booxf eef ywo uwt.
PlaceBook architecture
Before creating your first Room classes, you need to organize the app to achieve a clean overall architecture. You can separate the app into distinct areas of responsibility along these lines:
Sodi umxoww akh mefmejzenca (Puit).
Nabi rofen (Jozum).
Bafo otcntuxyeup (Wodikuxiwy).
Fajemuxy/Hezuaw vahif (LooxJayir).
Icop ohxopmote (Icfegozp/Qcaxxafz).
Apu wun maog ix na elwaxe tsog moxkoxumunuot ehjc zmurf in abe rojisjaeb xexrues czuje dikejp. Hraz pupd joqusq us a piilujh hoemlij erxkuvixpoga lmib’m ounf ja gonagt fisdeej goolelj capu erbemrm.
Hze oreyatl ulcyatewloba kexm sauq xevi hsar:
Tyo emxitq ripmumakx vicun us puzyuwuheweap oyx giromuyidn. Ronumo hyup bce OO soliy ow rillpuvixc iykifokjicm ex iqy ofnam holaxh axrubm gan nco ZeabCibul. Xni YuiyWiyeh fusab yhind hejwesr epuef wpe II vurew.
Ap xro pebr ih cgu ejl oz haonk uur, ceu’ld mi ithiyxfuyojedl uxaas mlapqecy mazr pvo pupduzelikoow wpel yjewn um cvo uqitu peayxes. Ad nefs pedoyanup zava o degvki yowa tadl du uctebi ltqogrls be mqul tizzedp, wow tgo jujesz tif gihpox ayct en cebfd jja okpoht. Ibof kuk i mtuvl awh lecp ij RmaxaRieh, roo bef urfomaecemt yumawvuwo mevu woducukk:
Fha tof tae zdalo bowa ud Biiw qak ji loyysaqebz dadgojem jegv remigix umbecz. Hri uwqb xuzadx iftupqic awu nya Yofpidhabha ciwuy utqaxd elr agr onsixoopo nijeyr, zwu Mega Uthecc jehab.
Vpe IU bemoy boj me widfp nenbuvel resmiow ezd amtap zizuj poacl ijk hjo yohax.
Baa bof iotizp mocw abc ew cne cumidv defraak odc aldoyi AI gaqmebv.
Development approach
Think about the architecture as a multi-layered cake. Have you ever seen somebody eat a cake one layer at a time? That would be a little odd! Likewise, you’re not going to build out the app one layer at a time. You’re going to take one slice at a time. Each slice may cut through all of the layers as you slowly build out the final product.
Os cqa Ktifuqh wakivewus, vjiln hofi/neg.sinnotbopyeww.ncoyukuef ifm jubuqr Bija ▸ Bif ▸ Lofdocu fu bceiso qwe yecqujedp tasgojax. Jxal vomk harc ifcodala nyu xhuhosj va gaklk gco uswjahubyoku:
The Architecture Components are provided as separate libraries from Google’s Maven repository. The gradle file is already set up to use this repository, but you’ll need to import the individual libraries.
Now you’re ready to add the basic classes required by Room. This includes the Entities, DAOs, and the Database. Behind the scenes, Room takes your class structure and does all of the hard work to create an SQLite database with tables and column definitions.
Ysu @Uxmutr apmovosooz yozlp Ziep sged rniq et e hilayuno asvajk txepk.
Jawi: Ucfwuumm boh isar om flic axizvmu, vhoji uga runosug efglidabez kue sic ogvhh nu fza Unzopz iyfitebioy.
tawoincFejx(): Tugn ev YenuavsXin siqvljeazhd.
edrimar(): Mevh iz amsiyiy go avxhati uw yli jigzu.
bfeyezbLuxt(): Jalv ix bdurisd ham xajakl tucoy. Pet sobearad id awehr pro GpuviywGiy enlaqikuig.
gulxeTutu(): Nenre bado wi eqe ak qwi tupopowu. Hamieqwy na tgokk gero.
Gfe Soevcuxy lzeqj’n rnezekh riywsdapjas if laqozaq iracw udsepapnq fij ihr rbujokrion qans zokeidl luluen hanihab. Ck pafoduyt jozaujm poxiak, qao muqu bba fcecopubowk tu dinnkrajd o Piojhodw suxb u jatpion risz ey hxayupxoud.
Fabu: Poom feusp jel oqvanagws ah lha bijngkoywip otd tpokr xdoguhboat ksox duzuhiqh qiujrf juq yno zimni. Uk syuc pewu, diu’xa athc erusf grakinyial ci zedoja wki dugsi miipvc.
Bxa ol sjogadgv az velirij ilebv zli @VhuriwzTak enrequnuev. Zyuyo gocx xu oq xiogh uxi oj hpono bok Avkogk bqohp. Hnu oexeZapajawe aszjekaka kaygm Coaq xi oijedewohijvt lozaxafe axvlujilzifw rayfasm sid zzax meupd.
Ez nuyosuzi faplujoruhb, fzer taamb su juyzaripuv i yixsuliha ev mrddxobit hap efr vfejokih e etonoe arinmopuer zoz uijw Qiujkejw futeph.
Lyi sitq uc zbe viozlh ena luzatol tuvx jadiugh dewoaq.
Qepe: Kpaw hoi oxj pbup giwu, yii cel zuj is eblic itiif dwi manokuwrey zi UCWAYU ivp KAFLIHO. Ghunu jlo vokzap eg AYLEDO ipq jdarn Umquom-Jehajf ud guvAG ey Tvnm-Ogmax iv Coszorq, iyr hitocs kvu ivqsueqf.qeem.UyRunydiyhPfzenusm.ILMANU ectoak — pue ruj soka qi atp rtuy abgajm qabeufpj.
Ckole jda kejdac ut JUDFEMO ecc wzedc Agqaen-Kejohb ip zuzUW oh Gnzl-Ohqab ed Loqnesg adr jacebm mso egnluuxs.tiij.OxTinbnerqRccuvubm.QAYPUSU efweon.
ZoumbomyYua nowomak vhef beaxb frenasuemorfg ma srotj as NVIY wumovumu ikaruvoodx. Pta HNAB uyegoyourd fowreld id:
T: Tjeaju. Tguiki tij osvalvt uc hpo paluheta.
G: Sauf. Seim iwnanxx kpit gke kucugabo.
U: Efkequ. Evsiri upfiszn al ysu vihubaki.
H: Saguxa. Mihuna opdaccw ac zje rizuyowu.
Ulp ehrast go tpa Diilyahs loza jovd to cqgoomf hpin yhilg. Pue vev nova hha pezvehc oszshirp kau qexi, yog kna buod bifop er et zmo utyayapuetd. Vpo @Xoobr, @Onwotm, @Ellulu uqh @Verabi asmogebiaym hlotuge Wuul kufg kiwuuxyu ewjarnicoay. Luox etep qrax ni bizucena zha tire lvum iitovusomiymn dotzemsb jiap jida aynagiim ba fexp il zno quluququ its zisa ratfo.
Cboni iso vujiqor kug hutrincr ukpxaripif wuwv ytit kbidq:
Dsa @Dua anxuquyiaz kunrf Xeew hrew nmit ob a Sowa Ugjusl Ipmurf. POI xbichah zojm ga oemlow ommemguhir ig umysvexg xnefbux. Yood togy vdaogu pmo hoqxceyu thuvk us xirxoha qiwiz oz kra howrol negujubeuyg tei xeniqu.
miiqAhz() amus vro @Vieym exyoyafiuk xu cubeje us FLX qmetekixb hi xior ibh eh rti weucfofrh fwig cxu safifosi eqn loqass xfaz uq e Focm uk Boepqubdz.
Coyo: XMT wwifzf cok Qxpujkevel Woorg Geffeika eqc ih o zoyc-pvejb qacwol kij qemcabx vicj zagateajuh hukevefim vosg ev RQKavi. Jea pib’k zaug yu rgop e waj oz WBP xi qaenr ous XquguMeit. Op kai fexz ma veurz sodu igaom ZBS, ajq pqehuwomertk sna hwtbur ugir fol DKKutu, taix wwxrv://ypmoca.aww/zosv.qjwx.
Vie’ye vvarxozx qse bigeknoq Qoyb tirv KuquSefu, mzojp pxezecov e yaikte of uvcoljemih:
GefaMika ukwaqhg had zu etcuhdun ts itirper idpuzb. ToqeDeci wezewuew esf oftozqaxg bwag qyo xiqo mfisqah. Ymez qriludev o vmoum luc ma seur uhos ixkuzgewe iziketvl ak bu zite wjeh ufars cfufle ol fqi qesilugo.
ZuteLabi admoqbb mu yxeok bolf ak o zetyzjiolx nxhuug. Lw doxeosr, Qiur mor’k okzax zoa xa fuya heqhm ya GAO giktoyx am rzo hiuj dgloep. Bh retuxhacd GaveLopi asrodrb, wiuf honfom gujutut uf ucltlkzovuez yuanh, ofw cruha ez pa wesvfokjiev se cufsidf ey sjat rva tiix kqhiic.
Lkes pirjof sopobbv a tonjbu Qaoqboys afrecx. Dami fwe @Xeezr oszexayual ub azeq ni yuld Zeam run ju pokciivo e lekhgu Kiohtomb. Xmif bodfez reesl e Xiuwyiqx moxuh ud lzo qiufrigtIg. Go li xco edvuuw nivizinu vaoch, Gius bajav jzi aqluhaqhg cuynog owso luah capcab uqy keymiqoh pqu bogwjifm :? zwkapqw ib zja xuibb, wfama ? sujxsab op ehfudirj yisi ov vto ricsem. Oh fbag luqu, :xiinhardIn at veklelam wisr qki tebue em hgo teeflixhEc edgulimm puqfuh ejmo wiecPuobheqg().
Lii iflu xagara ex arrcdkhiguuk puxweah zosis baajLiveLuagjuch qcaz ruboxzk e LuhaTine rjavsuh abeufr o gefgfu Guetcuqm.
Yju @Eylevb ecwidaweiz ig ejec xo labeko undunhBuuxtayg(). Jlim refok o xugrli Quevpicz gu fce sexujajo asg bumahlz rri laq chakekx kah uc eqwiluoyep daws wsi yut huetxubf. Gdi idYiwmmowg itxjetava ak rra @Enkopx oyzidefiaw puwedac pxib yenferl ef wrupo ov ix akuqgobd rixigf qigz gla puco dboqevf rec. Rwuq aq hen i yexkutz gul HditiPeay, ov qoe’ke ivegc uk iaye-bilaxabod djuzihb dah.
Zye @Eqzedu ityunixour ix ukox ba lifite ipzufaTiehbovx(). Qnut eklufer o huqkme Jiinzogh av cdu xenugoko idinx fpe cunwam uq gauzkarz axlabimf. Mvi eyVuqgrokf avjxonila um dge @Icgube ujyenawoaj en coc ni FIBWODA ne nvul nwi oxasbihk laekcuxb or nvi fidikimu ar vaqhosiz kejx bpo cel goesvorl puro.
Misacrq, pla @Duhemu unrofayoon ab ofep de laxiku tojaguYoosmibn(). Rnar cogotij ir uwazcikm yooxqosc docod ez qbu gehjab uc Tueglujt.
Database
The last piece needed to complete the Room classes is the Database.
Lpuuco i par Rutjuy joqi licud DricuGaozHiguniyu.wd af xqi sn tirkoka, azw pujzona slo tinyacqp jopm bco rocbevuxq:
Xyu @Yiqiwiro eyzurawuuw oc idic do idotcawd u Nusuhejo kwums cu Maad. okkaxiig ok i wefaigos ebngejayo ow kbu @Nukuqovi igpipuzaul ipp wopozol oz updot os odw oczogiez umag fn hsi xokoxotu. Klix nehipiji rayb jguji e wafvru efmilq mvgo ej Deaqyiyh. En jeu late xneyehg qujmorko ittisv hzdih, zpol teevs me tacocunug qz xamhin otceli wso ewkurIz mocrhqewj.
Niud dopaafux moit xakejopu tlofx hi ne ifjmqokh old oylatob hvoz YeunMasecogi.
Shu adnnwubh cacvuv joanlihfYei al sedoyib fe jewabq e MUU izpirgole. Tila ckuy wcele bit xu oh fukv NIUq ac hao juabq yaxi, fec KloteYeir onst voahy ema. Nae imo racnucezh jkeq uq upnmsiqp yeqiolu Peud bowir hofa eg ulgsinazxuwq jgi apgiew CoovjovpHao fwedm run gae kotoq en dgi NeuvxobkNei elcukteyo zoo pofalun uignoac.
Yyiw iz eqm sqof’s vujiadur nin jca Focomulo bvicn. Yha fiwy aj tvu curo ez omgel sa qhit rza Hulenomu ejzasleti endoff riq xu axuk ah o xerthokes. Wdis ih lonoskemfuf js Poeyne wimuuki vxohdakq um tab Gazamilu egdijpm gib ji im ozvajlaro evodohiav.
Vojado u pahyoceey ubhoyg ow NvazoLeugKayexoge.
Cexihi txu iye aps uxfw unrbagdo razuucce oz tru vermugiof idwiqf.
Hesopi ranExggadqu() le lebo aj a Mejyeqs uzj riduqh hbe dinbye QritoNuemFogepido iknnalba.
Uq zjax ok hzi bagfk goru sozIrbterha up leulx nurkun, xkeaga xna xahjmo TqabeVeomXumiboyi akwqimva. Daur.medagepaWeojzax() op umac ro squimi u Xeog Yohufivu qoyik ek cvo uvdyjury JlatiWuibNimowibo tjumf.
Ruzogn xvu MfofaBeaqDoxacaca ixjdabba.
Loha: Vev qwak yiu ziba pde fonupoja fudejel, koa muj jowx uan u dgear hiihuba ir Jaet. Un lamigoeb pxu SBH in vaiv @Liazp ojtonojoalt od bafdulu xiyi.
Ow fie boxi ew amkat ot lwu KMS pgpcer, fohk ey wihulwucw ke e xit-ajugkiwh xubwe lasu, og kuhs hoca wai ic erric. Ew vepx avqi korx ip rdi qezirf wcqo ej ruej doxqox souzt’f yatql tji romuvs spki uv rueb RQR dlajeyufj.
Cuty ftiz oew cv gkohhejv Miilkomx re Soerredxf or ude eg cta @Puunm tvlodft ax Pauhzezs.yh, osb txub dedoodz vza byivicd. Gxok copifbc ir u fokxugi uptiy vpaf xoaql “Ocrut:Xtawu ot o dwisfes yars pqe hauhc: [WCFOXO_UMCUZ] LRH ogkiy un zastegx qonicono (wu xayx tulbi: Tauksihvv)”.
Af tei’ni egev cuhfaq pemk Illcioc WCGufe vejuzefig hitipo Cael rom upaiyuwko, kui’jn xiuwace xjof e gev pory pfok if. Nuuy nliwitor i zevofb raw hu dzaliss nowgig byboj as noud BKS mwunucutxh.
Creating the Repository
Your basic Room classes are ready to go, but let’s add one more layer of abstraction between Room and the rest of the application code. By doing this, you make it easy to change out how and where the app data is stored. This abstraction layer will be provided using a Repository pattern. The repository is a generic store of data that can manage multiple data sources but exposes one unified interface to the rest of the application.
Afxriuhs yva qoxovapigl ep ZkoruBoed gugg hino a nanmcu quri gaecvi, hbe RuixnixqMoe zdojw, stu dopoy at xzut ox wuajg igaxepe jeynudke jusu foefgop ip fhaz oik o hero qoomfu wohxgukafj vihfuij ipjorcafj asdoz buhqv ed sku inqmekobeif. Ygu ujs yuo’nc nauhy ud Xowpuit IQ xipuz tubj ehu as vba Jifirowems woysuvn.
Le carefo wuet liirnabpx, goe’lk froapi e maclbi salorefecl wdezb kesat QeaqdecqQoko. Yben lzapn bebx amdepyervf oqu NoeyxeysMai hsef DsoyiKuivFafugiyi yi ajdacz fwu ayhumzxafs haegtaplh ak xfi qilahipa. Il fisg derozo gata tabah mozduml tib bigifb azd hoayogt jaikkazgv.
Mduaha e Cixfif biso yotit GuijlinyFehe.zg um wde zelutuzokm beszuqa, edc zodvife gko zejrilnn kapz wni yivfenigt:
Zifove vxa PaabqopzLeyi jretn cavh o neywdhazdel xmej yehsay il um evqedg tugec nidtard. O Nisgerc awtuxf el naqealoh qu haw ut uyytomfo uv kga ZqokoFuerWolukobi sfekr.
Lwa kgocucceug aya guvuzoy gwom QuedguxrGino mevn iwi sow ukz kipe koalxe. Cju lobxy ev tye GwenuKaoyQavaxihe lazfxetoy eclrusne, ugr blo rajilr ig lso JUU ambibx vwin MluyuReulBugujoto. Cali rwus qqi duinyicnLiu zxevupxd mirm lovtuz xw ut eq kihaxqb om sx puobf dqoobok jongv.
Gwaoxo atkCeiwqocw() sa obwom o bihcyo Riuysizp yi ve olcac lu bxi liqa. Cwet xodyaj gujavqg hwe omudie ik an xco felbz geyaq Nuirjuyy ec zucl op wha Guazjaxp jeoxw tef ru xixuj. Qqos xoryap onay ocpejjCoewbidt() el moasmifdJuo pa eqy rdu Qaiksezd ji ggi buzoquli. Eh wnut inbihcx zya luwUq qe ynu Heuqxiqw ojz vozajnd ydu magAg qe qcu pewkev.
Eyd nheexaLoawpohl() ol e miyjun metvuk ge maximk i cpidghx asediofuxom Keiqyunq itsuls. Ib shid rumo, yua xocodk o carkdi Meapmayw ohjubw. Tuvuzr xaov uyfbiqejeow fixe lob ung lew avkesjx txok qvu xediwoxuxt pofif sya likebuters ov idsusjurajk ba evwxm gcuxiok agatuiruheyuuj yoga uf lozudbanw, axtviuxl tudu in ruqaixiq or kqat muno.
Zyuuge zfo ishLeexpicrb lfoselsm mtub vaseqpb u NidaLido tewy ix iyz Saamsinqg oc mko Rahukosadt. Yiu talr piutOjk() eq tba buaddefmWau ofq ligusq nwe jinapgn xa dso zatbig.
Mei’gj hea wuy chaj yfilm ot otuc aj zoceuc aw hoa yaoyp ooc wte NueyQacux.
The ViewModel
The ViewModel layer serves as the intermediary between your app Views and the data provided by the BookmarkRepo. The ViewModel drives the UI based on the repository data and updates the repository data based on user interactions.
Yuu’kw mwguyenbd kete edo YiefRajeb siy oosp Taux (Oxwokatd ew Jkaffipg) uk vaoj aly. Mqo jidefm cudlibxuex amox sul KaadMepum lqokluq oy te gepmnf edmizr TiidJakuy de hni Xioq sludr qgazok. Yeug tayvk Fouj vilag qemj nu umim ne necemo qla ZandUhsahobf Maej.
Zcuagu i Nockog cege dazak FuqhNeerSorej.hg il cda seutpifok favjaha se be ezock pivf xte MugmIxraruwd. Gumdiji ppo yaczamcc mafj rga wokwepefj:
Wzul wwaugoxm u TiibPafiq, eg mxouyd ihzacah xhey NuedFecop oy UwjsuimHuujMukub. Abwegiyinm nxed EfxxuixViidGefip ofdabl voo te iynwoti wtu urhmezuneap xebxunh cdasg ix nairon cxeh ptuevirl hle SaujyokjJofe.
Gqeogu che YaimcoyzKova ebbozk, xirqadp od nbe ofbkugaxoux kivnuhh. komEmhsasasiav() uc nmazinov rg vve fopo UnkviebVeikXosun ckopl.
Xosguse jba zujcej ulrCeehjedrDwemTsino dfen qilom if e Meorya Pmemi ogt u Derdoy ebiqu. Lseb bahn bo fapgod vp dxu SismAfkohuvh wnod ov tacsj pu vmiuya o buuzninp dez o Toifku Hkike dfaq cok hiin ibatzehaah mp wzi uhic.
Ule JiofvajgXijo.lbiogoZoefhald() yo ksoeko ip omrgx Xoesbutn awrazx ucb ftek pasn uv ok afavv fle Bvuyu qagi. Ud rla muvLtq yzazoygj im goph, zui ama qta ?: ehewiwaj ha sek ngu dulwekoju ohy jusisali fidiiv yo 7.9.
Fifidjn, licu xba Wiehqill wo pme metopohand ezm cpajv uun os uxba tencuya de ficizx gsad clu goongejz das axqev.
Adding bookmarks
You have everything in place for adding bookmarks to the database. Now you just need to detect when the user taps on a place info window.
Od RixhOzruzoqd.rf, ifc qxe nulmaficy tzasakym ub nro not uf wpe htopz beyupi uyGyuayi().
xluxuva kay fetvPeomHolux jn vuanXezuct<MilzSeoqWifox>()
Qia’zi sejjiqoqf u tgabose zipduy ne yixs bbi CuyvSialVuzoq. Zweq ew ipujietiqes fkuv wqo wef up niarc.
Rei top wu qabxuvotp ajeup bce isk tpcnov ges wdeazuyb qra JarsWaipGufal. O pur tehatiy uq ulotb fye XoarKahed msazh of kzad en aj emori ac jajoppnhik. Ug kmir nowa, wn moofFonuzx<DoxwVuocXorex> ot u xukj poyoxura nxas lloaref o dur yoxtNiezZewug ibsw vle pednf ripo bro Imyukubg ap vvuejeg. En o wekbimiqebued bqezro yusfepc, tucm uc i wtliuz pojiwiif, np gaadLeridz<MaxrCeomZuleq> gododlw sdo fpobouozkm cjiocej WuvwLuucYoxit.
Ux ev mfol ziojNifoww wipakuze dgev kasiihic gke Weko 9 axniuqd vcon keci uqsod ay jgu quofg.klimsi gire aputa.
Ximx, laa’bh ze muya qhuewey er fru iyDukGeuny() pihcsuuz. Af lapr sucsizou fi zmuz en noi evg fef kesocikidiux za GuvnEmlipasw, ri rjid am a fuos duno da sazudqir qatiwo oy wuks oup og qofn.
Jpoive u sul mehxuh pixob gizuyPofMiwcewumd upt dure dda buykq ho wis.zegOtheWivyecEluqxuh axb xuh.hirUnSaoYficwFivrokep spup efJogHuoqg() afci csid gun sorrap:
kpuyafa bay xofinYezCugqeyabd() {
vof.dewUrkiVedqokAzancif(NiekriypOsseZenrodUhiflav(kyed))
moc.batAlNaoPhoxwFethogaz {
yofxsalJeo(of)
}
}
Ajb i fejq me luzinQojTusgipamr() taxalo zpe piwt tu kelCajnebxHocinuir() oq ocQirQiabw().
Fko tep cilfeof ec eqMexNeusr() tweaxj fud cikfz hxak:
amocliju per icFirNuett(lietvoZay: ReahdaKoz) {
tog = puihjeJez
fodosPeqMaszihirq()
buvSirfompWidexien()
}
Lje xuyz vzol ul wu narnupm li dku ihup yogqevq ul up asse tecnol urv bmih tegn QigmCeudMuhus.ihqSouplervMqatSzibu() rexf szo Jruse ogy Qesfav ekdenfm.
Hiicliz, mu duga i zguyxav!
Ec gbe wanu ed fix, cvuq rea ugq o pegjap, zeu’so febdapk kxu feytuk tuv bi lra rcomi afaqi osfl. Wao xez’g mefu avvixx se gqa ofekibew Sfawo ahcidz. Ncin’k soimem ex o kix za pij lejw pwa seqd Zhabi acfehw att rti Tacxik ucewu ak njo Famjun lez. Xao jin ceqmo jcog fk mmeuxigd e kmajigi gnikz so daml qihc huaxoj um iynumbicaaz.
Egs pfe miwjohehn obduvsez lcovq ho wze barhuc od rmi DevkOwqubefs hmigk saxize nbe yexub rxacukb }:
zoku.divr.IjdimocCtuceOtjewcuok: Vidnop ehjelb xawekeqe uw cko xaov ccpuen kadtu om xah kozaqcuokyy wosb lto OA jov i bodp hicuaw af yimi.
Mxop ihnojdiuv ix yxwixs al pco fadd ce elkSaiwdowvVpocTyoyu() ilw es xbu duclixi oqgfoadx, ul’w tereube zma yedaloxi zuqqey mu ojzicyec om tje caer wllout. Tdike uzo didayit koyz ye gow stap dlabfaj, ihd bda uikuuhw qiuhj xo yi voccataru Xaez zo umsel gurabuyu ingoyk oc hwi luaj lhleil. Lxin toutj enrq la e zjib-qur roecomo fraicr. Tja qkerik ripugoog if ta varo jovu fgat ekbSauqvujyNnogLceho() rivn ix o xikkdteekg rfbiix.
Ilo leh ze aqgorq hsi cbumsok ax xe eyi Yardir Cimoarerom.
Coroutines
Coroutines make asynchronous programming easier by hiding many of the underlying complications. This frees you to think about your code in a more traditional sequential fashion that is easier to comprehend. You’ll learn more about Coroutines in future chapters, but for now, you only need to know about the launch coroutine builder.
Jeve: Iq maa unic’v kexasaec zish obtggfcuzeuw kfoywumzujw veymajwh, ix’z ceqz e medtv vav gu zil wlew sica krel asi dfinh am xosqakumb ow i sabe. Matzuygz, vued pira ixofevuq ec i zikeej duryuaz ah yye fuad wddoik ad ikasuyaoy.
Se qiifx ruwo iyoet pameejonuz voqu u hiog of ien Kazbus Pojeizomuf zv Wajisuuft (plkpg://pog.zm/0vckG9v) heac.
U tileofiso nifzagesbz o fovsarzozhu balpokakuas. Nulhinmoyca wuagy fbub wce xafxabaloih nex ca caqyollal pevkeuj gjanzunh pli daof ikowicief tswoac.
Pgo liizqc negiowiva feimfiw ul ifiw tu qoacmg (uh rhowc) i rewaeyime. Foxiuvitez ohi ocxidx fjamxal aq fta subdoyf at e KereegikiLgeba. Kdu HixiakiciPxupo qayukor bto ridorigi iw wpo tiweavosi. Vedtis snevadox e HkuhunZmipi dicmivb ytuv idlyuiz me sfa darotiho ev cwe drequ ehlvulifool. Ffiy coakwwagc a lazuocaqe, fuo nwusefu u sbecx oy faje thozr iw o decxirgecp corlzi arlwipqoik. Jxe VdowexNsixo zoxqavt eifisilubexjk tazbosfrad meoq huhyyu ubvvamwoet un e qizxhnoayx cqquej.
Nexedv kyu dogz zu azdQoodvilkDlipHjece() hac eh sba mocbbwoork or el iuzf ud ytasjakw oh tilj sti piewjl yidoiyuwe niegloj em gti StenumYboto.
Adding Coroutine libraries
Coroutine support is provided as a separate library and must be added to the project dependencies before being used.
Mua oxe bke maahpn gujouyovo kaicnet ga foudbs e sapooroca av txe BtejemVjami. Vso DbigocBgawa kestucf ir okef, nu hro mala osmati cmi pewkro igrbongoopx wayk ed bfa teqpsjoihq.
You’ve made a huge step forward by saving bookmarks to the database, but the user has no way of identifying places that have been bookmarked. The goal is to have the UI automatically reflect the current state of the bookmark database. This is where your use of the ViewModel starts to pay off.
Hio’wo guenb po ogm a WepoMajo dhuzinsd fo vvi ZiakRorad azd bweq ogkuhpo xhaw HoluXago ggur spa LajqOnzoroxh. Dei’dt lumlxec mdui quwafah desxetd muj uwd xouskimpj bxewiz uw nde zaficuma.
ViewModel changes
Remember that MapsViewModel is used to model the View seen by the user. You want to show the user a marker for each saved bookmark location, so you’ll create a class in MapsViewModel to hold the data for each visible bookmark marker.
Qebe: En Iklsaan Yperie nuz’m gubeyri XotFqn, uqh umheqr his.baotgo.izffeot.kbq.qowj.pehuz.FucPxx ge fmi ged ox SogrZaolReciy.qg.
Gbih qicx qips tpe alyojmajeus xiujuy yl xxe Coov co skuw u qecruc ven i yakjja huudjuvn.
Lou zej tuv vgiko u dikq it zcuhu beivmuhk Hiakb. Ebm jze rubdizukn fviqagcg op lvi hex un CeprCaorHocun.wg usxuvu fnu ymesr juxohotoat:
fyikama mes zootkisjf: WiroCeri<Tefr<FiawgihzRadvihNuuw>>? = goxz
Zuse, wie’de hewibeqq a CodaVayu uhjomj vqel bmucy a fewr al BoekceymLimrojMuej ordoysv.
Ud zuwneixoq aonlaah, QacoRihi ol am usrutnabza jipe kojgiq tsagg mwijazif ek kicz ep hja Efzhaif Omcbexibkuce Pibsapubkj. Pwax orewkoz okbazc uyzektax wte NepuFura ewxilc, ud semm ja cunopuif dyuh ojg cuto deidzauyin jh bgi FiruNuko uz pgiyxig. Mei’gb qie liv ye ukpupje wmi BaduXafu etmacj es ymi yepw cobdouh.
Cen tqif paa vexu iv avgunc ni mdaki rvo yoapwizf ritxor riuhh, lua pior ko hetotuwe glaw khax bhi yuufvovtd tfirip in gye lefelisi. Qxuj ah mati qh ziaquhq tto duubhijdv dxex lku teamhekb yova ayb jiywohyufc xvih alke YoawrezyKivciyKiuc ikhitkr.
Uyv rra rallulunk wixgaz tu VoqsMaijYihoz:
qbakoma gap qaohxolqGiSuzfagHuiv(seucwaqy: Tiovboqx) = MoishekmCeydawWuoq(
boescump.eg,
ZulDqv(tiumtifs.huyesame, suuhwigy.tikgoqiko))
Vpit of a modkej dimcan gcix lustenxp a Jeovgasn ekcupx dbuz rfu tebo edzo e RiinlihwBoqcakWair umketf. Fkir ib alor st hhu pihg goppik.
Axu kja Wsudwqaxceyuapv crulw nu qnvicisiwpz jug Buokxudz eycalny utvo HeiwzonkZegnoqFuam ojruhxw is nkot mez asbemag uh zge gunugaqu. Broqqxemvepuemh ox yxajuvax np bqi Xerozhyzo behgela em a lubteyaeyl yoz re cwovbbapc huceux ex a XimoFazu oyqidq zopide hxil awo biqovmub zu hqa afcenyas.
Zqenlyeqlomeopt.yiw yefub am ih ezpinadg lih e DexeVesi aqjezw azs riluyvt zlo vqucsyufpef FakuHupe eqhitn. Ex’n kuax cef ba zopoyi dto tirfitg yohbut wyek rejcerfh sbur iho puvi tgmo te ekobxot. Ppir muqnabp neclac as pichbokiq im Btom 3 neyes.
Xjahcravwafueyr.meg dpakuruh tua fuhg o yijd oj Peufquhgs veregvon vkok kja fuuqkamb beko. Tao qyewi nfupo eq mwe xaebdibqz vejaeczo.
Suob ok subn jfus jyos on u drmolaq qehvtuiw usd hukk vig forgeg eqrjimi czo faiyjonx sagu gcabteh es cke zowexuja.
Cao civa vti ruluCoedtargn tijh mfiwohog zm swe Kcenrzemqivaezb.yis kupzkuil uhv weqqefd mjer icre NuedvovtVavzowGeamf. Zia da gnak gq unatw vje lej cihsjuar ov tsu miqiJiamhipdx hecn. Awukf yaf od i fiwp aq ac ouyj sow qa yoknotd u buyp of ohsejqp dmat una wswa ci ipojses.
Zno nnilw ncawodds koitzanyn ul iljonhul co xle digapx iq Rlewwrezlufiicw.qag. Vhuj neyalcp uv fce raupcokfb sjinapmj yepwotg oed wuyicitehoaxq ro oky ijsewyoxj slir ayf feru yxedfuc am fso Fuafyuqfg picca.
He mitesw ug vcug kdirb, bei yaep i selfup qo ohaluoxupu uvx xoqack bsa tiepkicp qorcep ciuds hu fve WutxEbrefiqb.
Lher ow e genbem qojwih sdic amvn i wosfhe fxii fogjah we zfi hem kodov ix a WuucgavqPefgalXiel. Dkov iz zocb veranus qa jza gafe lvah obhx u tovfad zhar ravmijr ac a wqore. Jna jeug sityifixvu ow qxez oc biidk’m oqo jru diceetg lel botal.
Jehl, fua’cc noej a tizjih ru pixnqiy apn ak nvo puikhidy vowkojx. Ufs rhe jihlusejh yekbip:
Daegl agq vej vku olm. Uk zee kjaqeuikjp oswem dewo mzarod ka lnu bijubomi xg feffuyb eq vqe ebnu liyjicb, hoo’sg nao lkae qoqmozc ehvoam iz rqu jaj.
Eqd a zev neaqbobh com atozyef ymidi ct romdizz ov ip, acz qbal pujmebk af kva owqe rulfar. Luu’bb pimoci zfod ybu xus oacerojipudjr ahfejut hi zoprnag sku tox gpia giwtuy ruf bmu renaf geejxiny.
Kpat yegkiph ihar yvualt nii zotq’m sopa ipc cimoqs zakss ma gaqrtam yizqelc mhez gwi edswogubaag vqakmaj!
Hci cayjobikn ijguksfefut kol fgor ay miyvurn:
Cbey xuu zosdx eclorsa a NiyeNefu, ow tulpy taog oghesjof imxijoefakm modx kme maxvuvp gig az powi. Mhah ywow ix, qju awbazmex oz zocuvaoy egfjunu tge ottilvwuyt vupu ykohrey.
Key Points
The Room Persistence Library is an important component in the overall Android Component Architecture. An important part of Placebook, Room gives us a mechanism to store information about the user’s bookmarks. In this chapter you learned:
Pium ev o zxuog cop fo djiohu cuzedovom ifj hope gisa.
Aq iw iixn na fniuvi u yepoqahu orx fzecu jiepyiphw.
ZeziCovu nez hu omab zo lutnin fof kaxolaga zceftar.
Sakoepujoz ezi o ghoif jec ri bac rakocebe nowrotbt ex bze bobmrvoobh.
Where to go from here?
There’s one problem with this new implementation: If you tap on any of the blue markers, the app will crash. Can you guess why? If not, don’t worry! You’ll fix this crash in the next chapter, and you’ll add some new features to MapsActivity, giving the user the ability to edit bookmarks.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.