Framework comparisons for iOS persistence often line three sample models up next to each other and let the tidiest syntax win. What should decide instead is the list of operations that data actually needs to support, plus whether the product will eventually ask for sync across devices.
The recommendation follows from those operations. Plain queries in a SwiftUI app point at SwiftData — with the caveat, worked through explicitly, that the obvious model will not sync with CloudKit. An existing stack points at Core Data. When the queries themselves are the hard part — complex predicates, full-text search, large batch updates — the answer is SQLite through GRDB, because that is the control the higher-level frameworks do not hand back.
Around the choice sit the decisions that outlive it: don't pass persistence models through the whole app, return values rather than live database objects across concurrency boundaries, and plan migrations before the first release rather than after it.
This is the second half of a pair. “iOS Data Storage: Classify Your Data Before You Choose a Database” sorts everything a travel-planning app stores into six categories and settles five of them without a database at all; this one deals with the sixth.