Jelajahi Sumber

Save Carbs to CoreData

Jon Mårtensson 3 tahun lalu
induk
melakukan
7657b9bff0

+ 4 - 0
Carbohydrates+CoreDataClass.swift

@@ -0,0 +1,4 @@
+import CoreData
+import Foundation
+
+@objc(Carbohydrates) public class Carbohydrates: NSManagedObject {}

+ 12 - 0
Carbohydrates+CoreDataProperties.swift

@@ -0,0 +1,12 @@
+import CoreData
+import Foundation
+
+public extension Carbohydrates {
+    @nonobjc class func fetchRequest() -> NSFetchRequest<Carbohydrates> {
+        NSFetchRequest<Carbohydrates>(entityName: "Carbohydrates")
+    }
+
+    @NSManaged var date: Date?
+    @NSManaged var carbs: NSDecimalNumber?
+    @NSManaged var enteredBy: String?
+}

+ 5 - 0
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -1,5 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21513" systemVersion="22C65" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
+    <entity name="Carbohydrates" representedClassName="Carbohydrates" syncable="YES" codeGenerationType="class">
+        <attribute name="carbs" optional="YES" attributeType="Decimal" defaultValueString="0"/>
+        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
+        <attribute name="enteredBy" optional="YES" attributeType="String"/>
+    </entity>
     <entity name="LoopStatRecord" representedClassName="LoopStatRecord" syncable="YES" codeGenerationType="class">
         <attribute name="duration" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
         <attribute name="end" optional="YES" attributeType="Date" usesScalarValueType="NO"/>

+ 6 - 0
FreeAPS.xcworkspace/contents.xcworkspacedata

@@ -5,6 +5,12 @@
       location = "container:"
       name = "CoreDataClassesAndProperties">
       <FileRef
+         location = "group:Carbohydrates+CoreDataClass.swift">
+      </FileRef>
+      <FileRef
+         location = "group:Carbohydrates+CoreDataProperties.swift">
+      </FileRef>
+      <FileRef
          location = "group:LoopStatRecord+CoreDataClass.swift">
       </FileRef>
       <FileRef

+ 14 - 2
FreeAPS/Sources/APS/APSManager.swift

@@ -785,7 +785,19 @@ final class BaseAPSManager: APSManager, Injectable {
 
         let units = settingsManager.settings.units
         let preferences = settingsManager.preferences
-        let carbs = storage.retrieve(OpenAPS.Monitor.carbHistory, as: [CarbsEntry].self)
+
+        // MARK: Fetch Carbs from CoreData
+
+        let requestCarbs = Carbohydrates.fetchRequest() as NSFetchRequest<Carbohydrates>
+        let hoursAgo = Date().addingTimeInterval(-24.hours.timeInterval)
+        requestCarbs.predicate = NSPredicate(format: "date > %@ AND carbs > 0", hoursAgo as NSDate)
+        let sortCarbs = NSSortDescriptor(key: "date", ascending: true)
+        requestCarbs.sortDescriptors = [sortCarbs]
+        var carbs = [Carbohydrates]()
+        try? carbs = coredataContext.fetch(requestCarbs)
+        let carbTotal = carbs.map({ carbs in carbs.carbs as? Decimal ?? 0 }).reduce(0, +)
+
+        // MARK: Fetch TDD from CoreData
 
         let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
         requestTDD.predicate = NSPredicate(format: "tdd > 0")
@@ -802,7 +814,7 @@ final class BaseAPSManager: APSManager, Injectable {
         }
 
         var algo_ = "Oref0"
-        let carbTotal = carbs?.map({ carbs in carbs.carbs }).reduce(0, +) ?? 0
+
         if preferences.sigmoid, preferences.enableDynamicCR {
             algo_ = "Dynamic ISF + CR: Sigmoid"
         } else if preferences.sigmoid, !preferences.enableDynamicCR {

+ 19 - 0
FreeAPS/Sources/APS/Storage/CarbsStorage.swift

@@ -1,3 +1,4 @@
+import CoreData
 import Foundation
 import SwiftDate
 import Swinject
@@ -19,6 +20,8 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
     @Injected() private var storage: FileStorage!
     @Injected() private var broadcaster: Broadcaster!
 
+    let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
+
     init(resolver: Resolver) {
         injectServices(resolver)
     }
@@ -34,6 +37,22 @@ final class BaseCarbsStorage: CarbsStorage, Injectable {
                     .sorted { $0.createdAt > $1.createdAt } ?? []
                 storage.save(Array(uniqEvents), as: file)
             }
+
+            // MARK: Save to CoreData. TEST
+
+            var cbs: Decimal = 0
+            var carbDate = Date()
+            if carbs.isNotEmpty {
+                cbs = carbs[0].carbs
+                carbDate = carbs[0].createdAt
+            }
+            if cbs != 0 {
+                let carbDataForStats = Carbohydrates(context: coredataContext)
+                carbDataForStats.date = carbDate
+                carbDataForStats.carbs = cbs as NSDecimalNumber
+                try? coredataContext.save()
+            }
+
             broadcaster.notify(CarbsObserver.self, on: processQueue) {
                 $0.carbsDidUpdate(uniqEvents)
             }