+{"primaryContentSections":[{"kind":"content","content":[{"anchor":"Overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This library helps building SwiftUI applications that access “services”, such as a local database, through the SwiftUI environment."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Its main purpose is to help users of the "},{"type":"reference","isActive":true,"identifier":"https:\/\/2.zoppoz.workers.dev:443\/http\/github.com\/groue\/GRDB.swift"},{"type":"text","text":" SQLite toolkit. Yet GRDBQuery has no dependency on GRDB: you can use it in other contexts, in a Core Data or Realm application, and generally in any kind of app, as long as you’d like to put the SwiftUI environment to good use."}]},{"anchor":"Whats-in-the-Box","level":2,"type":"heading","text":"What’s in the Box?"},{"type":"paragraph","inlineContent":[{"type":"text","text":"GRDBQuery provides two property wrappers:"}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"With "},{"type":"strong","inlineContent":[{"type":"codeVoice","code":"@Query"}]},{"type":"text","text":", SwiftUI views can automatically update their content when the database changes. Generally speaking, "},{"type":"codeVoice","code":"@Query"},{"type":"text","text":" helps subscribing to Combine publishers defined from the SwiftUI environment:"}]},{"type":"codeListing","syntax":"swift","code":["\/\/\/ A view that displays an always up-to-date list of players in the database.","struct PlayerList: View {"," @Query(PlayersRequest())"," var players: [Player]"," "," var body: some View {"," List(players) { player in Text(player.name) }"," }","}"]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"With "},{"type":"strong","inlineContent":[{"type":"codeVoice","code":"@EnvironmentStateObject"}]},{"type":"text","text":", applications can build observable objects that find their dependencies in the SwiftUI environment:"}]},{"type":"codeListing","syntax":"swift","code":["\/\/\/ A view that displays the list of players provided by its view model.","struct PlayerList: View {"," @EnvironmentStateObject var viewModel: PlayerListViewModel"," "," init() {"," _viewModel = EnvironmentStateObject { env in"," PlayerListViewModel(database: env.database)"," }"," }"," "," var body: some View {"," List(viewModel.players) { player in Text(player.name) }"," }","}"]},{"type":"paragraph","inlineContent":[{"type":"codeVoice","code":"@EnvironmentStateObject"},{"type":"text","text":" is a general-purpose property wrapper, akin to the SwiftUI "},{"type":"codeVoice","code":"@Environment"},{"type":"text","text":", "},{"type":"codeVoice","code":"@EnvironmentObject"},{"type":"text","text":", "},{"type":"codeVoice","code":"@ObservedObject"},{"type":"text","text":", and "},{"type":"codeVoice","code":"@StateObject"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"It fits well the view models of the MVVM architecture, as well as dependency injection."}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Both property wrappers can work together, so that developers can run quick experiments, build versatile previews, and also apply strict patterns and conventions. Pick "},{"type":"codeVoice","code":"@Query"},{"type":"text","text":", or "},{"type":"codeVoice","code":"@EnvironmentStateObject"},{"type":"text","text":", depending on your needs!"}]},{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/2.zoppoz.workers.dev:443\/http\/github.com\/groue\/GRDBQuery"}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/grdbquery"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The SwiftUI companion for GRDB"}],"kind":"symbol","metadata":{"roleHeading":"Framework","externalID":"GRDBQuery","title":"GRDBQuery","symbolKind":"module","role":"collection","modules":[{"name":"GRDBQuery"}]},"hierarchy":{"paths":[[]]},"topicSections":[{"title":"The @Query property wrapper","identifiers":["doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/GettingStarted","doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/QueryableParameters","doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/Query","doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/QueryObservation","doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/Queryable"]},{"title":"The MVVM architecture","identifiers":["doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/MVVM","doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/EnvironmentStateObject"]}],"references":{"doc://GRDBQuery/documentation/GRDBQuery/QueryObservation":{"role":"symbol","title":"QueryObservation","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"QueryObservation"}],"abstract":[{"type":"text","text":"A "},{"type":"codeVoice","code":"QueryObservation"},{"type":"text","text":" controls when "},{"type":"codeVoice","code":"@Query"},{"type":"text","text":" property wrappers are observing"},{"type":"text","text":" "},{"type":"text","text":"their requests."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/QueryObservation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"QueryObservation"}],"url":"\/documentation\/grdbquery\/queryobservation"},"http://github.com/groue/GRDBQuery":{"title":"Download GRDBQuery on GitHub","titleInlineContent":[{"type":"text","text":"Download GRDBQuery on GitHub"}],"type":"link","identifier":"https:\/\/2.zoppoz.workers.dev:443\/http\/github.com\/groue\/GRDBQuery","url":"https:\/\/2.zoppoz.workers.dev:443\/http\/github.com\/groue\/GRDBQuery"},"doc://GRDBQuery/documentation/GRDBQuery/QueryableParameters":{"role":"article","title":"Adding Parameters to Queryable Types","abstract":[{"type":"text","text":"Learn how SwiftUI views can configure the database content displayed on screen."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/QueryableParameters","kind":"article","type":"topic","url":"\/documentation\/grdbquery\/queryableparameters"},"doc://GRDBQuery/documentation/GRDBQuery/Query":{"role":"symbol","title":"Query","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Query"}],"abstract":[{"type":"text","text":"A property wrapper that subscribes to its "},{"type":"codeVoice","code":"Request"},{"type":"text","text":" (a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/Queryable"},{"type":"text","text":" "},{"type":"text","text":"type), and invalidates a SwiftUI view whenever the database values change."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/Query","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Query"}],"url":"\/documentation\/grdbquery\/query"},"doc://GRDBQuery/documentation/GRDBQuery":{"role":"collection","title":"GRDBQuery","abstract":[{"type":"text","text":"The SwiftUI companion for GRDB"}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery","kind":"symbol","type":"topic","url":"\/documentation\/grdbquery"},"doc://GRDBQuery/documentation/GRDBQuery/MVVM":{"role":"article","title":"MVVM and Dependency Injection","abstract":[{"type":"text","text":"Learn how the "},{"type":"codeVoice","code":"@EnvironmentStateObject"},{"type":"text","text":" property wrapper helps building MVVM applications."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/MVVM","kind":"article","type":"topic","url":"\/documentation\/grdbquery\/mvvm"},"doc://GRDBQuery/documentation/GRDBQuery/GettingStarted":{"role":"collectionGroup","title":"Getting Started with @Query","abstract":[{"type":"text","text":"A step-by-step guide for using "},{"type":"codeVoice","code":"@Query"},{"type":"text","text":" in your SwiftUI application."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/GettingStarted","kind":"article","type":"topic","url":"\/documentation\/grdbquery\/gettingstarted"},"http://github.com/groue/GRDB.swift":{"title":"GRDB","titleInlineContent":[{"type":"text","text":"GRDB"}],"type":"link","identifier":"https:\/\/2.zoppoz.workers.dev:443\/http\/github.com\/groue\/GRDB.swift","url":"https:\/\/2.zoppoz.workers.dev:443\/http\/github.com\/groue\/GRDB.swift"},"doc://GRDBQuery/documentation/GRDBQuery/EnvironmentStateObject":{"role":"symbol","title":"EnvironmentStateObject","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"EnvironmentStateObject"}],"abstract":[{"type":"text","text":"A property wrapper that instantiates an observable object from the"},{"type":"text","text":" "},{"type":"text","text":"SwiftUI environment."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/EnvironmentStateObject","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"EnvironmentStateObject"}],"url":"\/documentation\/grdbquery\/environmentstateobject"},"doc://GRDBQuery/documentation/GRDBQuery/Queryable":{"role":"symbol","title":"Queryable","fragments":[{"kind":"keyword","text":"protocol"},{"kind":"text","text":" "},{"kind":"identifier","text":"Queryable"}],"abstract":[{"type":"codeVoice","code":"Queryable"},{"type":"text","text":" types feed the the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/Query"},{"type":"text","text":" property wrapper."}],"identifier":"doc:\/\/GRDBQuery\/documentation\/GRDBQuery\/Queryable","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Queryable"}],"url":"\/documentation\/grdbquery\/queryable"}}}
0 commit comments