:saprkles: Adding CoreData Helper Classes

- Also adding lecturer entity and relationship between event and lecturers.
- Preparation for CoreData refactoring
This commit is contained in:
Patrick Müller 2021-02-10 19:17:11 +01:00 committed by Patrick Müller
parent e5ecb6bb60
commit f50ba8f19d
9 changed files with 293 additions and 20 deletions

View File

@ -12,6 +12,7 @@
CD2FC0C625A869FE00963178 /* dhbw-standard-icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD2FC0C125A869FE00963178 /* dhbw-standard-icon@3x.png */; }; CD2FC0C625A869FE00963178 /* dhbw-standard-icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD2FC0C125A869FE00963178 /* dhbw-standard-icon@3x.png */; };
CD2FC0C725A869FE00963178 /* alpaca-alt-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD2FC0C325A869FE00963178 /* alpaca-alt-icon@2x.png */; }; CD2FC0C725A869FE00963178 /* alpaca-alt-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD2FC0C325A869FE00963178 /* alpaca-alt-icon@2x.png */; };
CD2FC0C825A869FE00963178 /* alpaca-alt-icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD2FC0C425A869FE00963178 /* alpaca-alt-icon@3x.png */; }; CD2FC0C825A869FE00963178 /* alpaca-alt-icon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD2FC0C425A869FE00963178 /* alpaca-alt-icon@3x.png */; };
CD67FB2A25D45A3300069CDB /* RaPlaEvent+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD67FB2925D45A3300069CDB /* RaPlaEvent+CoreDataProperties.swift */; };
CD730A35259A860E00E0BB69 /* SettingsAcknowledgements.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD730A34259A860E00E0BB69 /* SettingsAcknowledgements.swift */; }; CD730A35259A860E00E0BB69 /* SettingsAcknowledgements.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD730A34259A860E00E0BB69 /* SettingsAcknowledgements.swift */; };
CD8555BE25C47AE500C4ACD6 /* RaPlaFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8555BD25C47AE500C4ACD6 /* RaPlaFetcher.swift */; }; CD8555BE25C47AE500C4ACD6 /* RaPlaFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8555BD25C47AE500C4ACD6 /* RaPlaFetcher.swift */; };
CD8555C325C47B5300C4ACD6 /* ApiService.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8555C225C47B5300C4ACD6 /* ApiService.swift */; }; CD8555C325C47B5300C4ACD6 /* ApiService.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8555C225C47B5300C4ACD6 /* ApiService.swift */; };
@ -23,10 +24,15 @@
CD9FAB8D258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CD9FAB8B258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld */; }; CD9FAB8D258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CD9FAB8B258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld */; };
CD9FAB98258EC60600D6D0C5 /* DHBW_ServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9FAB97258EC60600D6D0C5 /* DHBW_ServiceTests.swift */; }; CD9FAB98258EC60600D6D0C5 /* DHBW_ServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9FAB97258EC60600D6D0C5 /* DHBW_ServiceTests.swift */; };
CD9FABA3258EC60600D6D0C5 /* DHBW_ServiceUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9FABA2258EC60600D6D0C5 /* DHBW_ServiceUITests.swift */; }; CD9FABA3258EC60600D6D0C5 /* DHBW_ServiceUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9FABA2258EC60600D6D0C5 /* DHBW_ServiceUITests.swift */; };
CDA1CBAE25D4591000DB2AE5 /* User+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA1CBA825D4591000DB2AE5 /* User+CoreDataProperties.swift */; };
CDA1CBB025D4591000DB2AE5 /* Lecturer+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA1CBAA25D4591000DB2AE5 /* Lecturer+CoreDataProperties.swift */; };
CDCD721A25912E1200FBF2F5 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCD721925912E1200FBF2F5 /* HomeView.swift */; }; CDCD721A25912E1200FBF2F5 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCD721925912E1200FBF2F5 /* HomeView.swift */; };
CDCD72242591316500FBF2F5 /* LocalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCD72232591316500FBF2F5 /* LocalSettings.swift */; }; CDCD72242591316500FBF2F5 /* LocalSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCD72232591316500FBF2F5 /* LocalSettings.swift */; };
CDCD7230259135C500FBF2F5 /* FirstOpeningSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCD722F259135C500FBF2F5 /* FirstOpeningSettings.swift */; }; CDCD7230259135C500FBF2F5 /* FirstOpeningSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCD722F259135C500FBF2F5 /* FirstOpeningSettings.swift */; };
CDD39B4B259A64150078D05F /* SettingsMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD39B4A259A64150078D05F /* SettingsMain.swift */; }; CDD39B4B259A64150078D05F /* SettingsMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD39B4A259A64150078D05F /* SettingsMain.swift */; };
CDD970DD25D453D90061755E /* User+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD970D725D453D90061755E /* User+CoreDataClass.swift */; };
CDD970DF25D453D90061755E /* Lecturer+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD970D925D453D90061755E /* Lecturer+CoreDataClass.swift */; };
CDD970E125D453D90061755E /* RaPlaEvent+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD970DB25D453D90061755E /* RaPlaEvent+CoreDataClass.swift */; };
CDDCF47B2591FE550027CDC5 /* UtilityFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDCF47A2591FE550027CDC5 /* UtilityFunctions.swift */; }; CDDCF47B2591FE550027CDC5 /* UtilityFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDCF47A2591FE550027CDC5 /* UtilityFunctions.swift */; };
CDDCF4842592028A0027CDC5 /* Localizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDCF4832592028A0027CDC5 /* Localizer.swift */; }; CDDCF4842592028A0027CDC5 /* Localizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDCF4832592028A0027CDC5 /* Localizer.swift */; };
CDDCF493259203390027CDC5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CDDCF495259203390027CDC5 /* Localizable.strings */; }; CDDCF493259203390027CDC5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CDDCF495259203390027CDC5 /* Localizable.strings */; };
@ -59,6 +65,7 @@
CD2FC0C125A869FE00963178 /* dhbw-standard-icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dhbw-standard-icon@3x.png"; sourceTree = "<group>"; }; CD2FC0C125A869FE00963178 /* dhbw-standard-icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dhbw-standard-icon@3x.png"; sourceTree = "<group>"; };
CD2FC0C325A869FE00963178 /* alpaca-alt-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "alpaca-alt-icon@2x.png"; sourceTree = "<group>"; }; CD2FC0C325A869FE00963178 /* alpaca-alt-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "alpaca-alt-icon@2x.png"; sourceTree = "<group>"; };
CD2FC0C425A869FE00963178 /* alpaca-alt-icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "alpaca-alt-icon@3x.png"; sourceTree = "<group>"; }; CD2FC0C425A869FE00963178 /* alpaca-alt-icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "alpaca-alt-icon@3x.png"; sourceTree = "<group>"; };
CD67FB2925D45A3300069CDB /* RaPlaEvent+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "RaPlaEvent+CoreDataProperties.swift"; sourceTree = "<group>"; };
CD730A34259A860E00E0BB69 /* SettingsAcknowledgements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAcknowledgements.swift; sourceTree = "<group>"; }; CD730A34259A860E00E0BB69 /* SettingsAcknowledgements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAcknowledgements.swift; sourceTree = "<group>"; };
CD8555BD25C47AE500C4ACD6 /* RaPlaFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RaPlaFetcher.swift; sourceTree = "<group>"; }; CD8555BD25C47AE500C4ACD6 /* RaPlaFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RaPlaFetcher.swift; sourceTree = "<group>"; };
CD8555C225C47B5300C4ACD6 /* ApiService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiService.swift; sourceTree = "<group>"; }; CD8555C225C47B5300C4ACD6 /* ApiService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiService.swift; sourceTree = "<group>"; };
@ -76,10 +83,15 @@
CD9FAB9E258EC60600D6D0C5 /* DHBW-ServiceUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DHBW-ServiceUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; CD9FAB9E258EC60600D6D0C5 /* DHBW-ServiceUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DHBW-ServiceUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
CD9FABA2258EC60600D6D0C5 /* DHBW_ServiceUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DHBW_ServiceUITests.swift; sourceTree = "<group>"; }; CD9FABA2258EC60600D6D0C5 /* DHBW_ServiceUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DHBW_ServiceUITests.swift; sourceTree = "<group>"; };
CD9FABA4258EC60600D6D0C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; CD9FABA4258EC60600D6D0C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CDA1CBA825D4591000DB2AE5 /* User+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "User+CoreDataProperties.swift"; path = "DHBW-Service/CoreData/Models/User+CoreDataProperties.swift"; sourceTree = SOURCE_ROOT; };
CDA1CBAA25D4591000DB2AE5 /* Lecturer+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "Lecturer+CoreDataProperties.swift"; path = "DHBW-Service/CoreData/Models/Lecturer+CoreDataProperties.swift"; sourceTree = SOURCE_ROOT; };
CDCD721925912E1200FBF2F5 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; }; CDCD721925912E1200FBF2F5 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
CDCD72232591316500FBF2F5 /* LocalSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalSettings.swift; sourceTree = "<group>"; }; CDCD72232591316500FBF2F5 /* LocalSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalSettings.swift; sourceTree = "<group>"; };
CDCD722F259135C500FBF2F5 /* FirstOpeningSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstOpeningSettings.swift; sourceTree = "<group>"; }; CDCD722F259135C500FBF2F5 /* FirstOpeningSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstOpeningSettings.swift; sourceTree = "<group>"; };
CDD39B4A259A64150078D05F /* SettingsMain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMain.swift; sourceTree = "<group>"; }; CDD39B4A259A64150078D05F /* SettingsMain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMain.swift; sourceTree = "<group>"; };
CDD970D725D453D90061755E /* User+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "User+CoreDataClass.swift"; sourceTree = "<group>"; };
CDD970D925D453D90061755E /* Lecturer+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Lecturer+CoreDataClass.swift"; sourceTree = "<group>"; };
CDD970DB25D453D90061755E /* RaPlaEvent+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RaPlaEvent+CoreDataClass.swift"; sourceTree = "<group>"; };
CDDCF47A2591FE550027CDC5 /* UtilityFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityFunctions.swift; sourceTree = "<group>"; }; CDDCF47A2591FE550027CDC5 /* UtilityFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilityFunctions.swift; sourceTree = "<group>"; };
CDDCF4832592028A0027CDC5 /* Localizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localizer.swift; sourceTree = "<group>"; }; CDDCF4832592028A0027CDC5 /* Localizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localizer.swift; sourceTree = "<group>"; };
CDDCF494259203390027CDC5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; CDDCF494259203390027CDC5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
@ -115,6 +127,19 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
CD1ED26325D33B590030B647 /* Models */ = {
isa = PBXGroup;
children = (
CDD970D925D453D90061755E /* Lecturer+CoreDataClass.swift */,
CDA1CBAA25D4591000DB2AE5 /* Lecturer+CoreDataProperties.swift */,
CDD970DB25D453D90061755E /* RaPlaEvent+CoreDataClass.swift */,
CD67FB2925D45A3300069CDB /* RaPlaEvent+CoreDataProperties.swift */,
CDD970D725D453D90061755E /* User+CoreDataClass.swift */,
CDA1CBA825D4591000DB2AE5 /* User+CoreDataProperties.swift */,
);
path = Models;
sourceTree = "<group>";
};
CD2FC0BD25A869F000963178 /* res */ = { CD2FC0BD25A869F000963178 /* res */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -239,6 +264,7 @@
CDCD721125912D5400FBF2F5 /* CoreData */ = { CDCD721125912D5400FBF2F5 /* CoreData */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CD1ED26325D33B590030B647 /* Models */,
CD9FAB8B258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld */, CD9FAB8B258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld */,
CD9FAB89258EC60600D6D0C5 /* Persistence.swift */, CD9FAB89258EC60600D6D0C5 /* Persistence.swift */,
); );
@ -443,19 +469,25 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
CDDCF4842592028A0027CDC5 /* Localizer.swift in Sources */, CDDCF4842592028A0027CDC5 /* Localizer.swift in Sources */,
CDD970DF25D453D90061755E /* Lecturer+CoreDataClass.swift in Sources */,
CDCD7230259135C500FBF2F5 /* FirstOpeningSettings.swift in Sources */, CDCD7230259135C500FBF2F5 /* FirstOpeningSettings.swift in Sources */,
CDA1CBB025D4591000DB2AE5 /* Lecturer+CoreDataProperties.swift in Sources */,
CD9FAB8A258EC60600D6D0C5 /* Persistence.swift in Sources */, CD9FAB8A258EC60600D6D0C5 /* Persistence.swift in Sources */,
CD730A35259A860E00E0BB69 /* SettingsAcknowledgements.swift in Sources */, CD730A35259A860E00E0BB69 /* SettingsAcknowledgements.swift in Sources */,
CD9FAB83258EC60200D6D0C5 /* ContentView.swift in Sources */, CD9FAB83258EC60200D6D0C5 /* ContentView.swift in Sources */,
CDCD72242591316500FBF2F5 /* LocalSettings.swift in Sources */, CDCD72242591316500FBF2F5 /* LocalSettings.swift in Sources */,
CDD970E125D453D90061755E /* RaPlaEvent+CoreDataClass.swift in Sources */,
CDD970DD25D453D90061755E /* User+CoreDataClass.swift in Sources */,
CD8555BE25C47AE500C4ACD6 /* RaPlaFetcher.swift in Sources */, CD8555BE25C47AE500C4ACD6 /* RaPlaFetcher.swift in Sources */,
CDEA70C025C85999001CFE28 /* LecturePlanItem.swift in Sources */, CDEA70C025C85999001CFE28 /* LecturePlanItem.swift in Sources */,
CD8555C325C47B5300C4ACD6 /* ApiService.swift in Sources */, CD8555C325C47B5300C4ACD6 /* ApiService.swift in Sources */,
CD9FAB8D258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld in Sources */, CD9FAB8D258EC60600D6D0C5 /* DHBW_Service.xcdatamodeld in Sources */,
CDCD721A25912E1200FBF2F5 /* HomeView.swift in Sources */, CDCD721A25912E1200FBF2F5 /* HomeView.swift in Sources */,
CDD39B4B259A64150078D05F /* SettingsMain.swift in Sources */, CDD39B4B259A64150078D05F /* SettingsMain.swift in Sources */,
CD67FB2A25D45A3300069CDB /* RaPlaEvent+CoreDataProperties.swift in Sources */,
CDEA70B225C6054F001CFE28 /* LecturePlanList.swift in Sources */, CDEA70B225C6054F001CFE28 /* LecturePlanList.swift in Sources */,
CDDCF47B2591FE550027CDC5 /* UtilityFunctions.swift in Sources */, CDDCF47B2591FE550027CDC5 /* UtilityFunctions.swift in Sources */,
CDA1CBAE25D4591000DB2AE5 /* User+CoreDataProperties.swift in Sources */,
CD9FAB81258EC60200D6D0C5 /* DHBW_ServiceApp.swift in Sources */, CD9FAB81258EC60200D6D0C5 /* DHBW_ServiceApp.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="17709" systemVersion="20D62" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithCloudKit="YES" userDefinedModelVersionIdentifier=""> <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="17709" systemVersion="20D62" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithCloudKit="YES" userDefinedModelVersionIdentifier="">
<entity name="RaPlaEvent" representedClassName="RaPlaEvent" syncable="YES" codeGenerationType="class"> <entity name="Lecturer" representedClassName="Lecturer" syncable="YES">
<attribute name="email" optional="YES" attributeType="String"/>
<attribute name="name" optional="YES" attributeType="String"/>
<relationship name="event" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="RaPlaEvent" inverseName="lecturers" inverseEntity="RaPlaEvent"/>
</entity>
<entity name="RaPlaEvent" representedClassName="RaPlaEvent" syncable="YES">
<attribute name="category" optional="YES" attributeType="String"/> <attribute name="category" optional="YES" attributeType="String"/>
<attribute name="descr" optional="YES" attributeType="String"/> <attribute name="descr" optional="YES" attributeType="String"/>
<attribute name="endDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/> <attribute name="endDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
@ -9,14 +14,16 @@
<attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/> <attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="summary" optional="YES" attributeType="String"/> <attribute name="summary" optional="YES" attributeType="String"/>
<attribute name="uid" optional="YES" attributeType="String"/> <attribute name="uid" optional="YES" attributeType="String"/>
<relationship name="lecturers" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Lecturer" inverseName="event" inverseEntity="Lecturer"/>
</entity> </entity>
<entity name="User" representedClassName="User" syncable="YES" codeGenerationType="class"> <entity name="User" representedClassName="User" syncable="YES">
<attribute name="course" optional="YES" attributeType="String"/> <attribute name="course" optional="YES" attributeType="String"/>
<attribute name="director" optional="YES" attributeType="String"/> <attribute name="director" optional="YES" attributeType="String"/>
<attribute name="name" optional="YES" attributeType="String"/> <attribute name="name" optional="YES" attributeType="String"/>
</entity> </entity>
<elements> <elements>
<element name="RaPlaEvent" positionX="-63" positionY="9" width="128" height="149"/> <element name="Lecturer" positionX="-351" positionY="99" width="128" height="74"/>
<element name="User" positionX="-63" positionY="-9" width="128" height="74"/> <element name="RaPlaEvent" positionX="-271.3642578125" positionY="83.64776611328125" width="128" height="164"/>
<element name="User" positionX="-428.6358032226562" positionY="2.067169189453125" width="128" height="74"/>
</elements> </elements>
</model> </model>

View File

@ -0,0 +1,25 @@
//
// Lecturer+CoreDataClass.swift
// DHBW-Service
//
// Created by Patrick Müller on 10.02.21.
//
//
import Foundation
import CoreData
@objc(Lecturer)
public class Lecturer: NSManagedObject {
@nonobjc public class func getAll() -> [Lecturer] {
let managedContext =
PersistenceController.shared.context
do {
return try managedContext.fetch(Lecturer.fetchRequest())
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
return []
}
}
}

View File

@ -0,0 +1,27 @@
//
// Lecturer+CoreDataProperties.swift
// DHBW-Service
//
// Created by Patrick Müller on 10.02.21.
//
//
import Foundation
import CoreData
extension Lecturer {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Lecturer> {
return NSFetchRequest<Lecturer>(entityName: "Lecturer")
}
@NSManaged public var email: String?
@NSManaged public var name: String?
@NSManaged public var event: RaPlaEvent?
}
extension Lecturer : Identifiable {
}

View File

@ -0,0 +1,25 @@
//
// RaPlaEvent+CoreDataClass.swift
// DHBW-Service
//
// Created by Patrick Müller on 10.02.21.
//
//
import Foundation
import CoreData
@objc(RaPlaEvent)
public class RaPlaEvent: NSManagedObject {
@nonobjc public class func getAll() -> [RaPlaEvent] {
let managedContext =
PersistenceController.shared.context
do {
return try managedContext.fetch(RaPlaEvent.fetchRequest())
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
return []
}
}
}

View File

@ -0,0 +1,50 @@
//
// RaPlaEvent+CoreDataProperties.swift
// DHBW-Service
//
// Created by Patrick Müller on 10.02.21.
//
//
import Foundation
import CoreData
extension RaPlaEvent {
@nonobjc public class func fetchRequest() -> NSFetchRequest<RaPlaEvent> {
return NSFetchRequest<RaPlaEvent>(entityName: "RaPlaEvent")
}
@NSManaged public var category: String?
@NSManaged public var descr: String?
@NSManaged public var endDate: Date?
@NSManaged public var isHidden: Bool
@NSManaged public var location: String?
@NSManaged public var startDate: Date?
@NSManaged public var summary: String?
@NSManaged public var uid: String?
@NSManaged public var lecturers: NSSet?
}
// MARK: Generated accessors for lecturers
extension RaPlaEvent {
@objc(addLecturersObject:)
@NSManaged public func addToLecturers(_ value: Lecturer)
@objc(removeLecturersObject:)
@NSManaged public func removeFromLecturers(_ value: Lecturer)
@objc(addLecturers:)
@NSManaged public func addToLecturers(_ values: NSSet)
@objc(removeLecturers:)
@NSManaged public func removeFromLecturers(_ values: NSSet)
}
extension RaPlaEvent : Identifiable {
}

View File

@ -0,0 +1,25 @@
//
// User+CoreDataClass.swift
// DHBW-Service
//
// Created by Patrick Müller on 10.02.21.
//
//
import Foundation
import CoreData
@objc(User)
public class User: NSManagedObject {
@nonobjc public class func getAll() -> [User] {
let managedContext =
PersistenceController.shared.context
do {
return try managedContext.fetch(User.fetchRequest())
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
return []
}
}
}

View File

@ -0,0 +1,27 @@
//
// User+CoreDataProperties.swift
// DHBW-Service
//
// Created by Patrick Müller on 10.02.21.
//
//
import Foundation
import CoreData
extension User {
@nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
return NSFetchRequest<User>(entityName: "User")
}
@NSManaged public var course: String?
@NSManaged public var director: String?
@NSManaged public var name: String?
}
extension User : Identifiable {
}

View File

@ -17,6 +17,12 @@ class RaPlaFetcher {
var location: String = "" //LOCATION var location: String = "" //LOCATION
var category: String = "" //CATEGORIES var category: String = "" //CATEGORIES
var uid: String = "" //UID var uid: String = "" //UID
var lecturers: [LecturerObj] = [] //ATTENDEE
}
public class LecturerObj {
var name: String = ""
var email: String = ""
} }
// Get the RaPla file from the given URL and save the events to CoreData // Get the RaPla file from the given URL and save the events to CoreData
@ -68,9 +74,24 @@ class RaPlaFetcher {
var events: [iCalEvent] = [] var events: [iCalEvent] = []
for eventString in eventStrings { for eventString in eventStrings {
let lines = eventString.components(separatedBy: .newlines) var lines = eventString.components(separatedBy: .newlines)
// Remove all blank lines that somehow are generated by the .components function
lines = removeBlankLines(lines: lines)
let evt = iCalEvent() let evt = iCalEvent()
// Iterate over all lines and merge lines that have been split by rapla first
for lineNr in 0...lines.count-1 {
if(lines[lineNr].hasPrefix(" ")){
lines[lineNr] = String(lines[lineNr].dropFirst())
lines[lineNr-1].append(lines[lineNr])
lines[lineNr] = ""
}
}
// Remove all blank lines again as we produced some while merging the lines
lines = removeBlankLines(lines: lines)
for line in lines { for line in lines {
var lineWithoutPrefix = line var lineWithoutPrefix = line
if(!line.contains(":")) { if(!line.contains(":")) {
@ -82,7 +103,7 @@ class RaPlaFetcher {
//Date format: 20181101T080000 //Date format: 20181101T080000
let dateFormatter = DateFormatter() let dateFormatter = DateFormatter()
if(lineWithoutPrefix.contains("Z")){ if(lineWithoutPrefix.contains("Z")){
dateFormatter.dateFormat = "yyyyMMdd'T'HHmmssZ" dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss'Z'"
} else { } else {
dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss" dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss"
} }
@ -91,7 +112,7 @@ class RaPlaFetcher {
} else if(line.hasPrefix("DTEND")){ } else if(line.hasPrefix("DTEND")){
let dateFormatter = DateFormatter() let dateFormatter = DateFormatter()
if(lineWithoutPrefix.contains("Z")){ if(lineWithoutPrefix.contains("Z")){
dateFormatter.dateFormat = "yyyyMMdd'T'HHmmssZ" dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss'Z'"
} else { } else {
dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss" dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss"
} }
@ -107,6 +128,22 @@ class RaPlaFetcher {
evt.category = lineWithoutPrefix evt.category = lineWithoutPrefix
} else if(line.hasPrefix("UID")){ } else if(line.hasPrefix("UID")){
evt.uid = lineWithoutPrefix evt.uid = lineWithoutPrefix
} else if(line.hasPrefix("ATTENDEE;ROLE=REQ-PARTICIPANT;")) {
var lecturerName = line
let begin = lecturerName.firstIndex(of: "\"")!
lecturerName.removeSubrange(lecturerName.startIndex...begin)
let end = lecturerName.lastIndex(of: "\"")!
lecturerName = String(lecturerName[..<end])
let lecturerEmail = String(lineWithoutPrefix[String.Index(utf16Offset: 7, in: lineWithoutPrefix)..<lineWithoutPrefix.endIndex])
let lecturer = LecturerObj()
lecturer.name = lecturerName
lecturer.email = lecturerEmail
evt.lecturers.append(lecturer)
} }
} }
@ -119,8 +156,8 @@ class RaPlaFetcher {
// Save the given iCalEvent objects to CoreData // Save the given iCalEvent objects to CoreData
// Updates the events if they already exist and deletes old (/invalid) ones // Updates the events if they already exist and deletes old (/invalid) ones
private class func saveToCoreData(eventObjects: [iCalEvent]) -> Bool{ private class func saveToCoreData(eventObjects: [iCalEvent]) -> Bool{
let existingEvents = UtilityFunctions.getCoreDataObject(entity: "RaPlaEvent", sortDescriptors: []) let existingEvents: [RaPlaEvent] = [] //RaPlaEvent.getAll()
var existingEventsDict: [String:NSManagedObject] = [:] var existingEventsDict: [String:RaPlaEvent] = [:]
for event in existingEvents { for event in existingEvents {
existingEventsDict[event.value(forKey: "uid") as! String] = event existingEventsDict[event.value(forKey: "uid") as! String] = event
} }
@ -128,23 +165,28 @@ class RaPlaFetcher {
for event in eventObjects { for event in eventObjects {
// If the event already exists locally, update it. Otherwise, create a new record // If the event already exists locally, update it. Otherwise, create a new record
let evt: NSManagedObject let evt: RaPlaEvent
if existingEventsDict.keys.contains(event.uid) { if existingEventsDict.keys.contains(event.uid) {
evt = existingEventsDict[event.uid]! evt = existingEventsDict[event.uid]!
} else { } else {
let entity = NSEntityDescription.entity(forEntityName: "RaPlaEvent", in: PersistenceController.shared.context)! evt = RaPlaEvent(context: PersistenceController.shared.context)
evt = NSManagedObject(entity: entity, insertInto: PersistenceController.shared.context)
// Set default values for new object // Set default values for new object
evt.setValue(false, forKey: "isHidden") evt.isHidden = false
}
evt.startDate = event.startDate
evt.endDate = event.endDate
evt.summary = event.summary
evt.descr = event.description
evt.location = event.location
evt.category = event.category
evt.uid = event.uid
for lecturer in event.lecturers {
let lect = Lecturer(context: PersistenceController.shared.context)
lect.name = lecturer.name
lect.email = lecturer.email
lect.event = evt
} }
evt.setValue(event.startDate, forKey: "startDate")
evt.setValue(event.endDate, forKey: "endDate")
evt.setValue(event.summary, forKey: "summary")
evt.setValue(event.description, forKey: "descr")
evt.setValue(event.location, forKey: "location")
evt.setValue(event.category, forKey: "category")
evt.setValue(event.uid, forKey: "uid")
} }
// Now we also have to delete locally stored events that have been deleted from RaPla // Now we also have to delete locally stored events that have been deleted from RaPla
@ -160,4 +202,17 @@ class RaPlaFetcher {
return true return true
} }
private class func removeBlankLines(lines: [String]) -> [String] {
var newLines = lines
// Remove all blank lines that somehow are generated by the .components function
for line in newLines {
if(line.isEmpty){
newLines.remove(at: newLines.firstIndex(of: line)!)
}
}
return newLines
}
} }