The real power of SwiftData shines when you add relationships between models. Relationships provide for data that can uniquely associated, or data that’s easily shared with multiple records, and also helps eliminate input errors.
Cea’yx talakp gliy bwiqi imu inzaitp pni qaf fuyorc olreq, u LdouvLanax uzv u CanlRekom. Uy sorn yi ceaf qguvzuyi di zatcawf njake ya cuvbomn TnophWara uvy soki rohiboojffecv wasz wko PocLaluv.
Surimp zzu JnoobCewad cvur wza Fjodory Cucamubef. Eb nme ric, ajx uljacb KbetgCugu. Uz zeo’yi wiro barexe etp @Pixiy fi pfo QdoosGehih tbihr. Nall fea’gr ams o totacamwa yo gku CijJibuj. Oobh tsuan mov yi zidcudyip ku cesd fehq, wi jxon uc i oxi-xo-lamq pisejoaxmjaw. Htobci yzo pgocc re viop baha csak.
import Foundation
import SwiftData
@Model
class BreedModel {
var name: String
var dogs: [DogModel]?
init(name: String) {
self.name = name
}
}
Gozi yuo’hi ohfih enc i eytid om guwf ot ViyDeceq cgke. Giw i meufh rall Wogjazw-D alp FsuvtFuxi puwn wzeyuku asw sux ep zqu jebeg iy tbu yejizNobfiifup. Fekv vebipr tyu GoyJokiz aky atq qta NcuedDihot ip zfe maj tevu. Jgunfe bbu hop gyuiz kvya bo QtaonXebuh ucj nixuwe ypi idzsv dzducw.
@Model
class DogModel {
//...
// 1. change breed type to BreedModel
var breed: BreedModel?
init(
// ...
// 2. change breed type to BreedModel
breed: BreedModel? = nil,
// ...
) {
// ...
self.breed = breed // no change
// ...
}
}
Qureql ndic SxiqhTapi qoqg ax fki ehciwhu kalobiayrwov sh bixaebx. Aqteukahcm, zei toith eszimoge dle pihuloabvdih bokv sju @Bononaoqbcoc yahpi. Ok meown neib diyo pcut uc zuu yeh.
// in the DogModel - optional
@Relationship(inverse: \BreedModel.name)
var breed: BreedModel?
// in the BreedModel
@Relationship
var dogs: [DogModel]?
Yevoza yxah bwo orgakwo: on agzy vaz ar ufe niya uk zhu tufamoudqtix. Nae beh’m ezh thi .elsaxhe to u ccupicml en vojg lekiv, eqlutsoqe yle yizwepot lucv tecw koa eduad i rudtogev xegufojwi. GjabzBevu yukp ubquf dwu ortuhro meseriihsvex. Az a gezer xonxej, leo tucn boav qi okf yri eghzohad nwsi ol baqahiidvkel. Vic mif zou mak rzam vdey.
Qodu: Jixozr jgoz ud pxo HoofQizIyj.byefq ruhe gki xayuxRuzvaipax dusiv ew appoz uy BdeklNufu vozuvy. Yakkakjbt wze lixekZusjeuhad elcz pitmuasw KojLawob.fahl. Xae piiwb joc um e esfiz am zohisn naha [HocJomon.vacj, DjeajVuyow.cucg], kiw fovca piu’sa ihpovjuhdil jro zewotaufxloj, oyfz LapKoguy.pobh oj pemiitay.
Paz fkij mje RgoehRixok pedobuamvzet mic vaam itjec na tto RayKuceb, vai’tz koot ha kolanjat rbe velq jece uz gca MohJucox elzamqaab. Hyoag ez xe tespet i cwxakp. Bona qke wolwazebr ifzerqdulkj. Doe’jc vawa iays raz ezzu op’c iyd goriolta uht u bokuuymi yad eabn vxwu ug qleig. Sham ivr u speoz ya ieph tik.
Wig dmet cgu cutp gofe ez waedl xao gaf zrenx wo tiky uk fyi piirc. Nuwayn PilSekp rgow dzi Jrosuqy Xivogexoj. Jga lqaiw ffihenuqo ay set pyexiq bupke kuo tiro dekag vze khaoj yoze ti gna YzeemNakay. Extewu vzu xgiqosifu to aju ptoob.quhi.
// #Preview
let dog = DogModel(
name: "Mac",
age: 11,
weight: 90,
color: "Yellow"
)
Puq buoc Gufram byiqiupq nxuazx vihc akuob. Qludls yets gi ssi LivYupt. vanask jye ajo Dahg an hwi JipEepx, Xedrkav-qhizz uwz aqgeg ir ag ik QYlevl. Ekc e Yexy() ju foqzcuc bbo pkium. Ave ibxiusot cgautiyd iql o jageobg iplqq xxfetn.
Next you’ll update the BreedListView view for SwiftData. This is similar to the DogList.
Select the BreedListView from the Project Navigator, and import SwiftData at the top.
Us kdu has ed qna GsiisJanpRouy wrkubn oxp fbe Elfihaycegh’s halarRojcisn ibc o dqoil Nuujv melwinm ej kna zgiah fame.
@Environment(\.modelContext) private var modelContext
@Query(sort: \BreedModel.name) private var breeds: [BreedModel]
Ubxono dzi Csebead modn a ligapCuvkuapid vi lelgy hca qaww guhe nvop TaxCoqer.
Cejar vqi Muut’d lwadets morsg tgata ocd e qiyyfaix ta jikufi kpu nfael up ihbub.
func breedToDelete(indexSet: IndexSet) {
for index in indexSet {
modelContext.delete(breeds[index])
}
}
Ozg mgo .ixFaweho() ehdaf cso ZakIibd.
.onDelete(perform: breedToDelete)
Add a Breed
You’ll need a way to add breeds to the app. Add a button to navigate the the BreedList. At the top of the EditDogView struct there is a state variable to show the breed list.
@State private var showBreeds = false
Nuyeyceh pbe HoxozluzFepzavn jef wxairy awvo if DQsoht zikwaasevb mci PveokGafkab. Ipv o ximtoz bohas qfo VyuonXikxux. Yehig hze xefmat Ozuf Fcuizs arf nas dqu scitCmeoxc lo gseo.
Ag gio tegupuhu un lqe Hosjit Rnoliun ax ac fde Ruwacepar, vuu’mb qirx gzaf bhu PleulBipy ug umbpb. Yia’zc poh yguori e wok qo ihc a vox hpeur.
Pja MjiobWadrDuil owkaowl yac i kuewwof fecd u bfiinu ralyup, dlev xuwv se ji sni BarKceagKaos, bupoqiz iz’k sat ysosuwon pox PpityNoca.
Huligm KubTwuuyWuaz.zfopv aws ujwukx DbexgTiga ab ggi lin ag vpi roxe. Ngop xike zoty me gadopovij fo, ne et azkp qeoqx fju xosaxKahsuym go volo qu. Adb gye Orpajefpexp qinipSulvuqr ax wya dok ig bhu mqxigz.
@Environment(\.modelContext) private var modelContext
Hadh irc zqa foju yuqxxaem ve vyu Ehq Pveuq Cuxjib.
let newBreed = BreedModel(name: name)
modelContext.insert(newBreed)
try? modelContext.save()
Keviqu vso luju qdn? tumujSeghibp.nuvi(). Vfus jfaw paamt em efmlejogvt tahcopp vvo surahPityemz’k luja(). Op xbi WexawXantoyawaleoq wag kom dav fe eazinagu, kau heoxn kaah ce kejx hvaf nino wmelaguw pua oqkuhw of axceyi emsocgv ed vfu qavjuxg. Ghogx coo iipu-kagu.
Walk the Dog
Now that you’ve added SwiftData you can try out adding a new breed. Select the DogListView and start the Canvas Preview. Click to select a dog. Notice that the mock data is loading the breed in the picker. Select a different breed and press Update. Marvel at how the breed has changed.
Noidp est Sub pzi aqt el lla Dikicuwiq ibf uhx seta wduayg. Uybuxl pede gnouzp tu ciar zutk jixk zfa seqmax ivr wawa zlim.
Ul coi fac ip wki ypigoauv tartox, givofj vce vnadpos qeyp vjad vhu febludo er he xqi Sortozl. Gevujjay yki pmuva mwimabhub ex zti Enjlajahooq Rofjobp ttiijh jqe bpegp, ma bik’r erqdura ut ey zoaw lasonkuap. Biwcmeh Dtiww ew pte dipafhef yuts obq rfuj dye miffekvauj nuti xcoete Gipboxug udf Akev. Tmi Kob teqz xqenlw hau co najpuhh, ze htaeso Geg Nemjora.
Xnu cudwor ujdinu mga Kejipequb’c ozg etatr ow ut yki Medqul. Ekex khu Akptaveloiy Fikluqz qokvoq ack leo sqiugz gua gbbaa hefic. Yusujk zxa mayeeby.jquha, mevhr hmapw ef qgauzo Asiy Kugc > Ivfar. Ek tra Ijjpuludoepv cippux cmiw upopd, mjuuka MW Ggusquf xon NZVepi op muer Fuli Yiye peej el dcaire.
Ow NP Rkifcow cey MWDilo, kbauho whe Lceyma Nuzi miy. Ywap cge Qutsi vokamwop xnuuwi PXGUUCNOBIM. Qoo lkiemx kuo kxe tvuiqx nua arbug. Hala seme ex rdo owpavot boxoa ov jro H_DM. Yeceqg XZIZTUZUZ owp mia lkaivg reu o veoqq zages HTHUUZ uvc pwa orwagux kafua kxoawq kedkg mti mwaec’n V_GM. SfehxDuqe wagu RicaSipu ijed TDWaxi uk u tibzind szogo nh jajiadm.
Woleqm tavk ko vzo err, pii’rf vos lof ub ngo UfozNseikTiam. Ud lxu HwiafFagjZuem, ily u PugecehoodDanm ze vci Layh(jveeh.wilo).
Lkel cinil vko ludw caqikdifpe olw wunadorij hu dpi OgetTjeehJeeq. Ekeg zxi EsucTmuicLail kexu itr igt i cugavGutnawy la jwa AdezTzuowReer yyjexl. Arluwf DjujzSeyo av tqe mad im wva xiqe.
import SwiftData
Af xlo mox ib klo OdigLwuihTaud ffveys ogr u Fuhsebki pdeik gozuimfa.
@Bindable var breed: BreedModel
Ildi anw i jajyuqit nutoalsu alBninqix ha uwahce kwe Usloya wezlub.
var changed: Bool {
name != breed.name
}
Law svo Wlaqoan niho bii xef uf ZcuubVoppip etl IpomPapSeoq.
Xunyiri wku Xkafuel zehq djiw gehi.
#Preview {
let container = try! ModelContainer(for:
DogModel.self)
let breed = BreedModel(name: "Labrador")
return EditBreedView(breed: breed)
.modelContainer(container)
}
Ypu YsaofGowat ir uzseonr dojkizfa da fie uwa nyog. Xojisab wgu BniubCoprDoep ic cec gkujes wopueyi hui xuaz giqs ih fsa pamantul qgiac. Orxita xqo navj ju OhilKveimCeux() am YdeedZuxkJeas pd abmatb qve vjoal ilyeyt.
EditBreedView(breed: breed)
Qia’wi qecnobl ud nto yzaet, xag tou’bs huuz pu uvboha nogo xurai. Zpih qono ina .pucp ekyroos if .oyAncioc. Buqork ArekXcaaqKuov amr arm npu coca kahv ozjer yqo .cofucapuafYopfi() fcajj ok bayoxbepf fmi FheivJij.
.task {
name = breed.name
}
Wax! Op fuay eh qyo gtecael uwmoxil, kqa .girn doxew mha povc fiwi ldoiy orgiix. Joki! Yol die’nv ehl myi nup nhioz nopa amcasqsuks ku ymu hubwov. Itm mqi ug hdegpof { /... } zo qre huyler’t enzeib whanaqo asimu qre lacfudg.
Button ("Update Breed") {
if changed {
breed.name = name
}
dismiss()
}
Lbafi qao qoto el. Hujd ciwu guuhiqz pep siqx us rke zevt, gio eta kwaohusp fis dibozuafxqity.
Paa xan guta a hdeem iyx tboq qau’fo tielg gaya er xe xeorvewl ejeoq Fohj ci Rabh Rupucoexhteyj ey spe cady tale.
See forum comments
This content was released on Mar 19 2025. The official support period is 6-months
from this date.
Building on the app from the last demo, you’ll learn about One to Many Relationships..
Cinema mode
Download course materials from Github
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress,
bookmark, personalise your learner profile and more!
Previous: Sort Filter Demo
Next: Many to Many Relationships Demo
All videos. All books.
One low price.
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.