Every new iOS project reaches the same fork in the road, and it is almost always framed as a framework decision: is SwiftData production-ready yet, should we stay on Core Data, would GRDB give us more control? Reasonable questions, wrong starting point. Before any of them can be answered you need to know what the app stores, how long it has to survive, how sensitive it is, whether a copy can be fetched from the server again, whether offline use is required, and whether it has to travel between devices.
So the piece works through a sample app and sorts its data by those properties rather than by convenience. UI preferences belong in UserDefaults. Tokens and credentials belong in the Keychain. Domain entities should be designed from the queries you will actually run, not from whichever persistence framework is fashionable. Large attachments belong on the filesystem, with the database holding references. Cache is not user data and should not be treated as if losing it were a bug.
It also walks the decisions that are painful to reverse after shipping: where the store's container lives, what happens when the store refuses to open, and why synchronisation is a separate system rather than a checkbox on your persistence layer.
Choosing the engine for the one category that does need a database is the subject of the follow-up, “SwiftData, Core Data, or GRDB: Choose by the Queries You Actually Run”.