以零初始化CoreData日期

问题描述 投票:1回答:3

我正在尝试在Date值为nil的核心数据中创建新行:

@ObservedObject var mealsController = CoreDataController()

...

Button(action: {
    self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: nil, eaten: nil)
}) {
    Image(systemName: "text.badge.plus")
}

但是当我尝试这样做时,出现错误:'nil' is not compatible with expected argument type 'Date'

我该如何在其中将该值定义为nil?我需要将它以nil的形式传递给我的控制器,因为我正在以文本形式读取它,因此在设置它之前,我不希望它具有任何值。

更新:这是它在另一个类上引用的create条目,基本上是同一件事:

// Create
    func createEntry(meal_type: String, status: String, will_eat: Date, eaten: Date) {
        _ = Meals(id: UUID(), meal_type: meal_type, status: status, eaten: eaten, will_eat: will_eat)
        saveToPersistentStore()
    }

然后将其保存到Core Data中,例如:

func saveToPersistentStore() {
        let moc = CoreDataStack.shared.mainContext
        do {
            try moc.save()
            getMeals()

        } catch {
            NSLog("Error saving managed object context: \(error)")
        }
    }
swift core-data swiftui
3个回答
0
投票

您必须使用CoreData上下文创建对象。

//assign the context to the object
let meal = Meals(context: self.moc)

meal.id = UUID()
.... 
meal.will_eat = nil // or just remove that line 

saveToPersistentStore()

我指的是您在其他函数中声明的moc。

let moc = CoreDataStack.shared.mainContext

0
投票

我不知道您的createEntry代码,但可以使用“?”在CoreData或createEntry函数中将日期设置为可选。同时声明它们:

class YourCoreDataEntity: NSManagedObject,Identifiable {
    @NSManaged var name:String
    @NSManaged var status:String
    @NSManaged var date1:Date?
    @NSManaged var date2:Date?
}

0
投票

编辑:如果您实际上要求dates不能为空且必须包含一个值,则可以使用.distantFuture.distantPast之类的默认值。这将为以后更改值提供更大的灵活性。这是代码:

self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: .distantFuture, eaten: .distantPast)

您需要更新createEntry函数,以使其接受Date?will_eat的可选eaten参数,如下所示:

func createEntry(meal_type: String, status: String, will_eat: Date?, eaten: Date?) {
    _ = Meals(id: UUID(), meal_type: meal_type, status: status, eaten: eaten, will_eat: will_eat)
    saveToPersistentStore()
}

注意:您可能还需要根据需要对模型进行较小的更改。

替代方法:您可以将日期都设置为Date(),也可以在显示位置检查两个日期是否都是equal,而不是将它们都选为nil。这是一些代码:

Button(action: {
    let now = Date()
    self.mealsController.createEntry(meal_type: "Test", status: "notSet", will_eat: now, eaten: now)
}) {
    Image(systemName: "text.badge.plus")
}

// And at the place of displaying

Text(meal.will_eat == meal.eaten ? "Date is not set." : "Date is set.")
© www.soinside.com 2019 - 2024. All rights reserved.