From 22d43b67baa727ca75353965115ebbacaeea09c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwendal=20Roue=CC=81?= Date: Sat, 21 Sep 2024 21:18:47 +0200 Subject: [PATCH 1/5] New demo app --- .../GRDBDemo.xcodeproj/project.pbxproj | 485 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../GRDBDemo/Database/AppDatabase.swift | 197 +++++++ .../GRDBDemo/Database/Models/Player.swift | 108 ++++ .../GRDBDemo/Database/Persistence.swift | 61 +++ .../GRDBDemo/GRDBDemo/GRDBDemoApp.swift | 29 ++ .../DemoApps2/GRDBDemo/GRDBDemo/Info.plist | 11 + .../Preview Assets.xcassets/Contents.json | 6 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 37 ++ .../Icon-Dark-1024\303\2271024.png" | Bin 0 -> 457655 bytes .../Icon-Light-1024\303\2271024.png" | Bin 0 -> 288380 bytes .../Resources/Assets.xcassets/Contents.json | 6 + .../LaunchScreen.imageset/Contents.json | 22 + .../LaunchScreen.imageset/LaunchIcon.pdf | Bin 0 -> 217656 bytes .../LaunchScreen.imageset/LaunchIcon~Dark.pdf | Bin 0 -> 943900 bytes .../GRDBDemo/Resources/Localizable.xcstrings | 83 +++ .../GRDBDemo/Views/PlayerCreationSheet.swift | 32 ++ .../GRDBDemo/Views/PlayerEditionView.swift | 41 ++ .../GRDBDemo/Views/PlayerFormView.swift | 52 ++ .../GRDBDemo/Views/PlayerListModel.swift | 72 +++ .../GRDBDemo/Views/PlayerListView.swift | 68 +++ .../GRDBDemo/Views/PlayerNavigationView.swift | 171 ++++++ .../GRDBDemoTests/AppDatabaseTests.swift | 55 ++ 24 files changed, 1554 insertions(+) create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.pbxproj create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/AppDatabase.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Models/Player.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Persistence.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/GRDBDemoApp.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Info.plist create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 "Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Dark-1024\303\2271024.png" create mode 100644 "Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Light-1024\303\2271024.png" create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/Contents.json create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/LaunchScreen.imageset/Contents.json create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/LaunchScreen.imageset/LaunchIcon.pdf create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/LaunchScreen.imageset/LaunchIcon~Dark.pdf create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Localizable.xcstrings create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Views/PlayerCreationSheet.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Views/PlayerEditionView.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Views/PlayerFormView.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Views/PlayerListModel.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Views/PlayerListView.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemo/Views/PlayerNavigationView.swift create mode 100644 Documentation/DemoApps2/GRDBDemo/GRDBDemoTests/AppDatabaseTests.swift diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.pbxproj b/Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..e0f7ee8615 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.pbxproj @@ -0,0 +1,485 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 56CFC6772C9F1E1B000B5023 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 56CFC6762C9F1E1B000B5023 /* GRDB */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 56CFC6552C9F1DCA000B5023 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 56CFC63C2C9F1DC9000B5023 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 56CFC6432C9F1DC9000B5023; + remoteInfo = GRDBDemo; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 56CFC6442C9F1DC9000B5023 /* GRDBDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GRDBDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 56CFC6542C9F1DCA000B5023 /* GRDBDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GRDBDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 56CFC6AA2C9F3ADB000B5023 /* Exceptions for "GRDBDemo" folder in "GRDBDemo" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 56CFC6432C9F1DC9000B5023 /* GRDBDemo */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 56CFC6462C9F1DC9000B5023 /* GRDBDemo */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 56CFC6AA2C9F3ADB000B5023 /* Exceptions for "GRDBDemo" folder in "GRDBDemo" target */, + ); + path = GRDBDemo; + sourceTree = ""; + }; + 56CFC6572C9F1DCA000B5023 /* GRDBDemoTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = GRDBDemoTests; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 56CFC6412C9F1DC9000B5023 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 56CFC6772C9F1E1B000B5023 /* GRDB in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 56CFC6512C9F1DCA000B5023 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 56CFC63B2C9F1DC9000B5023 = { + isa = PBXGroup; + children = ( + 56CFC6462C9F1DC9000B5023 /* GRDBDemo */, + 56CFC6572C9F1DCA000B5023 /* GRDBDemoTests */, + 56CFC6452C9F1DC9000B5023 /* Products */, + ); + sourceTree = ""; + }; + 56CFC6452C9F1DC9000B5023 /* Products */ = { + isa = PBXGroup; + children = ( + 56CFC6442C9F1DC9000B5023 /* GRDBDemo.app */, + 56CFC6542C9F1DCA000B5023 /* GRDBDemoTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 56CFC6432C9F1DC9000B5023 /* GRDBDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 56CFC6682C9F1DCB000B5023 /* Build configuration list for PBXNativeTarget "GRDBDemo" */; + buildPhases = ( + 56CFC6402C9F1DC9000B5023 /* Sources */, + 56CFC6412C9F1DC9000B5023 /* Frameworks */, + 56CFC6422C9F1DC9000B5023 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 56CFC6462C9F1DC9000B5023 /* GRDBDemo */, + ); + name = GRDBDemo; + packageProductDependencies = ( + 56CFC6762C9F1E1B000B5023 /* GRDB */, + ); + productName = GRDBDemo; + productReference = 56CFC6442C9F1DC9000B5023 /* GRDBDemo.app */; + productType = "com.apple.product-type.application"; + }; + 56CFC6532C9F1DCA000B5023 /* GRDBDemoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 56CFC66B2C9F1DCB000B5023 /* Build configuration list for PBXNativeTarget "GRDBDemoTests" */; + buildPhases = ( + 56CFC6502C9F1DCA000B5023 /* Sources */, + 56CFC6512C9F1DCA000B5023 /* Frameworks */, + 56CFC6522C9F1DCA000B5023 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 56CFC6562C9F1DCA000B5023 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 56CFC6572C9F1DCA000B5023 /* GRDBDemoTests */, + ); + name = GRDBDemoTests; + packageProductDependencies = ( + ); + productName = GRDBDemoTests; + productReference = 56CFC6542C9F1DCA000B5023 /* GRDBDemoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 56CFC63C2C9F1DC9000B5023 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 1600; + TargetAttributes = { + 56CFC6432C9F1DC9000B5023 = { + CreatedOnToolsVersion = 16.0; + }; + 56CFC6532C9F1DCA000B5023 = { + CreatedOnToolsVersion = 16.0; + TestTargetID = 56CFC6432C9F1DC9000B5023; + }; + }; + }; + buildConfigurationList = 56CFC63F2C9F1DC9000B5023 /* Build configuration list for PBXProject "GRDBDemo" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 56CFC63B2C9F1DC9000B5023; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 56CFC6752C9F1E1B000B5023 /* XCLocalSwiftPackageReference "../../../../GRDB.swift" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 56CFC6452C9F1DC9000B5023 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 56CFC6432C9F1DC9000B5023 /* GRDBDemo */, + 56CFC6532C9F1DCA000B5023 /* GRDBDemoTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 56CFC6422C9F1DC9000B5023 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 56CFC6522C9F1DCA000B5023 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 56CFC6402C9F1DC9000B5023 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 56CFC6502C9F1DCA000B5023 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 56CFC6562C9F1DCA000B5023 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 56CFC6432C9F1DC9000B5023 /* GRDBDemo */; + targetProxy = 56CFC6552C9F1DCA000B5023 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 56CFC6662C9F1DCB000B5023 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.6; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 56CFC6672C9F1DCB000B5023 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.6; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 56CFC6692C9F1DCB000B5023 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"GRDBDemo/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = GRDBDemo/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "GRDB Demo"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.github.groue.GRDBDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 56CFC66A2C9F1DCB000B5023 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"GRDBDemo/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = GRDBDemo/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "GRDB Demo"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.github.groue.GRDBDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 56CFC66C2C9F1DCB000B5023 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.github.groue.GRDBDemoTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GRDBDemo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/GRDBDemo"; + }; + name = Debug; + }; + 56CFC66D2C9F1DCB000B5023 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.github.groue.GRDBDemoTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GRDBDemo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/GRDBDemo"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 56CFC63F2C9F1DC9000B5023 /* Build configuration list for PBXProject "GRDBDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 56CFC6662C9F1DCB000B5023 /* Debug */, + 56CFC6672C9F1DCB000B5023 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 56CFC6682C9F1DCB000B5023 /* Build configuration list for PBXNativeTarget "GRDBDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 56CFC6692C9F1DCB000B5023 /* Debug */, + 56CFC66A2C9F1DCB000B5023 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 56CFC66B2C9F1DCB000B5023 /* Build configuration list for PBXNativeTarget "GRDBDemoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 56CFC66C2C9F1DCB000B5023 /* Debug */, + 56CFC66D2C9F1DCB000B5023 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 56CFC6752C9F1E1B000B5023 /* XCLocalSwiftPackageReference "../../../../GRDB.swift" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ../../../../GRDB.swift; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 56CFC6762C9F1E1B000B5023 /* GRDB */ = { + isa = XCSwiftPackageProductDependency; + productName = GRDB; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 56CFC63C2C9F1DC9000B5023 /* Project object */; +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..919434a625 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/AppDatabase.swift b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/AppDatabase.swift new file mode 100644 index 0000000000..a561262b04 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/AppDatabase.swift @@ -0,0 +1,197 @@ +import Foundation +import GRDB +import os.log + +/// A repository of players. +/// +/// You create a `AppDatabase` with a +/// [connection to an SQLite database](https://swiftpackageindex.com/groue/grdb.swift/documentation/grdb/databaseconnections), +/// created with a configuration returned from +/// ``makeConfiguration(_:)``. +/// +/// For example: +/// +/// ```swift +/// // Create an in-memory AppDatabase +/// let config = AppDatabase.makeConfiguration() +/// let dbQueue = try DatabaseQueue(configuration: config) +/// let appDatabase = try AppDatabase(dbQueue) +/// ``` +final class AppDatabase: Sendable { + /// Creates a `AppDatabase`, and makes sure the database schema + /// is ready. + /// + /// - important: Create the `DatabaseWriter` with a configuration + /// returned by ``makeConfiguration(_:)``. + init(_ dbWriter: any GRDB.DatabaseWriter) throws { + self.dbWriter = dbWriter + try migrator.migrate(dbWriter) + } + + /// Provides access to the database. + /// + /// Application can use a `DatabasePool`, while SwiftUI previews and tests + /// can use a fast in-memory `DatabaseQueue`. + /// + /// See + private let dbWriter: any DatabaseWriter + + /// The DatabaseMigrator that defines the database schema. + /// + /// See + private var migrator: DatabaseMigrator { + var migrator = DatabaseMigrator() + +#if DEBUG + // Speed up development by nuking the database when migrations change + // See + migrator.eraseDatabaseOnSchemaChange = true +#endif + + migrator.registerMigration("v1") { db in + // Create a table + // See + try db.create(table: "player") { t in + t.autoIncrementedPrimaryKey("id") + t.column("name", .text).notNull() + t.column("score", .integer).notNull() + } + } + + // Migrations for future application versions will be inserted here: + // migrator.registerMigration(...) { db in + // ... + // } + + return migrator + } +} + +// MARK: - Database Configuration + +extension AppDatabase { + private static let sqlLogger = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "SQL") + + /// Returns a database configuration suited for `AppDatabase`. + /// + /// SQL statements are logged if the `SQL_TRACE` environment variable + /// is set. + /// + /// - parameter base: A base configuration. + static func makeConfiguration(_ base: Configuration = Configuration()) -> Configuration { + var config = base + + // An opportunity to add required custom SQL functions or + // collations, if needed: + // config.prepareDatabase { db in + // db.add(function: ...) + // } + + // Log SQL statements if the `SQL_TRACE` environment variable is set. + // See + if ProcessInfo.processInfo.environment["SQL_TRACE"] != nil { + config.prepareDatabase { db in + db.trace { + // It's ok to log statements publicly. Sensitive + // information (statement arguments) are not logged + // unless config.publicStatementArguments is set + // (see below). + os_log("%{public}@", log: sqlLogger, type: .debug, String(describing: $0)) + } + } + } + +#if DEBUG + // Protect sensitive information by enabling verbose debugging in + // DEBUG builds only. + // See + config.publicStatementArguments = true +#endif + + return config + } +} + +// MARK: - Database Access: Writes +// The write methods execute invariant-preserving database transactions. +// In this demo repository, they are pretty simple. + +extension AppDatabase { + /// Saves (inserts or updates) a player. When the method returns, the + /// player is present in the database, and its id is not nil. + func savePlayer(_ player: inout Player) throws { + try dbWriter.write { db in + try player.save(db) + } + } + + /// Delete the specified players + func deletePlayers(ids: [Int64]) throws { + try dbWriter.write { db in + _ = try Player.deleteAll(db, keys: ids) + } + } + + /// Delete all players + func deleteAllPlayers() throws { + try dbWriter.write { db in + _ = try Player.deleteAll(db) + } + } + + /// Refresh all players (by performing some random changes, for demo purpose). + func refreshPlayers() async throws { + try await dbWriter.write { [self] db in + if try Player.all().isEmpty(db) { + // When database is empty, insert new random players + try createRandomPlayers(db) + } else { + // Insert a player + if Bool.random() { + _ = try Player.makeRandom().inserted(db) // insert but ignore inserted id + } + + // Delete a random player + if Bool.random() { + try Player.order(sql: "RANDOM()").limit(1).deleteAll(db) + } + + // Update some players + for var player in try Player.fetchAll(db) where Bool.random() { + try player.updateChanges(db) { + $0.score = Player.randomScore() + } + } + } + } + } + + /// Create random players if the database is empty. + func createRandomPlayersIfEmpty() throws { + try dbWriter.write { db in + if try Player.all().isEmpty(db) { + try createRandomPlayers(db) + } + } + } + + /// Support for `createRandomPlayersIfEmpty()` and `refreshPlayers()`. + private func createRandomPlayers(_ db: Database) throws { + for _ in 0..<8 { + _ = try Player.makeRandom().inserted(db) // insert but ignore inserted id + } + } +} + +// MARK: - Database Access: Reads + +// This demo app does not provide any specific reading method, and instead +// gives an unrestricted read-only access to the rest of the application. +// In your app, you are free to choose another path, and define focused +// reading methods. +extension AppDatabase { + /// Provides a read-only access to the database. + var reader: any GRDB.DatabaseReader { + dbWriter + } +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Models/Player.swift b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Models/Player.swift new file mode 100644 index 0000000000..0c63186f95 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Models/Player.swift @@ -0,0 +1,108 @@ +import GRDB + +/// The Player struct. +/// +/// Identifiable conformance supports SwiftUI list animations, and type-safe +/// GRDB primary key methods. +/// Equatable conformance supports tests. +struct Player: Equatable { + /// The player id. + /// + /// Int64 is the recommended type for auto-incremented database ids. + /// Use nil for players that are not inserted yet in the database. + var id: Int64? + var name: String + var score: Int +} + +extension Player { + private static let names = [ + "Arthur", "Anita", "Barbara", "Bernard", "Craig", "Chiara", "David", + "Dean", "Éric", "Elena", "Fatima", "Frederik", "Gilbert", "Georgette", + "Henriette", "Hassan", "Ignacio", "Irene", "Julie", "Jack", "Karl", + "Kristel", "Louis", "Liz", "Masashi", "Mary", "Noam", "Nicole", + "Ophelie", "Oleg", "Pascal", "Patricia", "Quentin", "Quinn", "Raoul", + "Rachel", "Stephan", "Susie", "Tristan", "Tatiana", "Ursule", "Urbain", + "Victor", "Violette", "Wilfried", "Wilhelmina", "Yvon", "Yann", + "Zazie", "Zoé"] + + /// Creates a new player with empty name and zero score + static func new() -> Player { + Player(id: nil, name: "", score: 0) + } + + /// Creates a new player with random name and random score + static func makeRandom() -> Player { + Player(id: nil, name: randomName(), score: randomScore()) + } + + /// Returns a random name + static func randomName() -> String { + names.randomElement()! + } + + /// Returns a random score + static func randomScore() -> Int { + 10 * Int.random(in: 0...100) + } +} + +// MARK: - Database + +/// Make Player a Codable Record. +/// +/// See +extension Player: Codable, FetchableRecord, MutablePersistableRecord { + // Define database columns from CodingKeys + enum Columns { + static let name = Column(CodingKeys.name) + static let score = Column(CodingKeys.score) + } + + /// Updates a player id after it has been inserted in the database. + mutating func didInsert(_ inserted: InsertionSuccess) { + id = inserted.rowID + } +} + +// Convenience access to player columns in this file +private typealias Columns = Player.Columns + +// MARK: - Player Database Requests + +/// Define some player requests used by the application. +/// +/// See +extension DerivableRequest { + /// A request of players ordered by name. + /// + /// For example: + /// + /// let players: [Player] = try dbWriter.read { db in + /// try Player.all().orderedByName().fetchAll(db) + /// } + func orderedByName() -> Self { + // Sort by name in a localized case insensitive fashion + // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison + order(Columns.name.collating(.localizedCaseInsensitiveCompare)) + } + + /// A request of players ordered by score. + /// + /// For example: + /// + /// let players: [Player] = try dbWriter.read { db in + /// try Player.all().orderedByScore().fetchAll(db) + /// } + /// let bestPlayer: Player? = try dbWriter.read { db in + /// try Player.all().orderedByScore().fetchOne(db) + /// } + func orderedByScore() -> Self { + // Sort by descending score, and then by name, in a + // localized case insensitive fashion + // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison + order( + Columns.score.desc, + Columns.name.collating(.localizedCaseInsensitiveCompare)) + } +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Persistence.swift b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Persistence.swift new file mode 100644 index 0000000000..94ab0ae79d --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Database/Persistence.swift @@ -0,0 +1,61 @@ +import Foundation +import GRDB + +extension AppDatabase { + /// The database for the application + static let shared = makeShared() + + private static func makeShared() -> AppDatabase { + do { + // Apply recommendations from + // + + // Create the "Application Support/Database" directory if needed + let fileManager = FileManager.default + let appSupportURL = try fileManager.url( + for: .applicationSupportDirectory, in: .userDomainMask, + appropriateFor: nil, create: true) + let directoryURL = appSupportURL.appendingPathComponent("Database", isDirectory: true) + try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true) + + // Open or create the database + let databaseURL = directoryURL.appendingPathComponent("db.sqlite") + let config = AppDatabase.makeConfiguration() + let dbPool = try DatabasePool(path: databaseURL.path, configuration: config) + + // Create the AppDatabase + let appDatabase = try AppDatabase(dbPool) + + // Populate the database if it is empty, for better demo purpose. + try appDatabase.createRandomPlayersIfEmpty() + + return appDatabase + } catch { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. + // + // Typical reasons for an error here include: + // * The parent directory cannot be created, or disallows writing. + // * The database is not accessible, due to permissions or data protection when the device is locked. + // * The device is out of space. + // * The database could not be migrated to its latest schema version. + // Check the error message to determine what the actual problem was. + fatalError("Unresolved error \(error)") + } + } + + /// Creates an empty database for SwiftUI previews + static func empty() -> AppDatabase { + // Connect to an in-memory database + // See https://swiftpackageindex.com/groue/grdb.swift/documentation/grdb/databaseconnections + let dbQueue = try! DatabaseQueue(configuration: AppDatabase.makeConfiguration()) + return try! AppDatabase(dbQueue) + } + + /// Creates a database full of random players for SwiftUI previews + static func random() -> AppDatabase { + let appDatabase = empty() + try! appDatabase.createRandomPlayersIfEmpty() + return appDatabase + } +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/GRDBDemoApp.swift b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/GRDBDemoApp.swift new file mode 100644 index 0000000000..e9c5dc94cc --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/GRDBDemoApp.swift @@ -0,0 +1,29 @@ +import SwiftUI + +@main +struct GRDBDemoApp: App { + var body: some Scene { + WindowGroup { + PlayerNavigationView().appDatabase(.shared) + } + } +} + +// MARK: - Give SwiftUI access to the database + +private struct AppDatabaseKey: EnvironmentKey { + static var defaultValue: AppDatabase { .empty() } +} + +extension EnvironmentValues { + var appDatabase: AppDatabase { + get { self[AppDatabaseKey.self] } + set { self[AppDatabaseKey.self] = newValue } + } +} + +extension View { + func appDatabase(_ appDatabase: AppDatabase) -> some View { + self.environment(\.appDatabase, appDatabase) + } +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Info.plist b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Info.plist new file mode 100644 index 0000000000..0427f524a1 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Info.plist @@ -0,0 +1,11 @@ + + + + + UILaunchScreen + + UIImageName + LaunchScreen + + + diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Preview Content/Preview Assets.xcassets/Contents.json b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..3395dad77a --- /dev/null +++ b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,37 @@ +{ + "images" : [ + { + "filename" : "Icon-Light-1024×1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Dark-1024×1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Dark-1024\303\2271024.png" "b/Documentation/DemoApps2/GRDBDemo/GRDBDemo/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Dark-1024\303\2271024.png" new file mode 100644 index 0000000000000000000000000000000000000000..a3aca30da863e338caca01153112afffe1b6cac5 GIT binary patch literal 457655 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