gpt4 book ai didi

ios - 一对多关系 setter

转载 作者:可可西里 更新时间:2023-11-01 02:05:12 25 4
gpt4 key购买 nike

这是我第一次在 swift 中使用 Core Data。我真的很喜欢它,但确保我的 Appdelegate 保存等也是一个挑战。

问题

基本上我正在创建一个预算应用程序。预算结束后,我需要获取当前预算并将其存储到历史实体中。现在我有 2 个不同的实体在这里工作:

NewBudgetCreateMO 和 HistoryBudgetHolderMO。应该发生的是 HistoryBudgetHolder 应该将预算 (newBudgetCreateMO) 添加到它的一对多关系中。这是我的图表及其关系的图片。

The data model

现在,如果我已经正确设置了它,我应该允许通过添加它们在我的历史记录中拥有尽可能多的 NewBudgetCreateMO 吗?下面的代码是为我的 History 实体生成的代码,它显示它包含一个 NSSet

extension HistoryBudgetHolderMO {

@nonobjc public class func fetchRequest() -> NSFetchRequest<HistoryBudgetHolderMO> {
return NSFetchRequest<HistoryBudgetHolderMO>(entityName: "HistoryBudgetHolder");
}

@NSManaged public var budgets: NSSet?

}

extension HistoryBudgetHolderMO {

@objc(addBudgetsObject:)
@NSManaged public func addToBudgets(_ value: NewBudgetCreateMO)

@objc(removeBudgetsObject:)
@NSManaged public func removeFromBudgets(_ value: NewBudgetCreateMO)

@objc(addBudgets:)
@NSManaged public func addToBudgets(_ values: NSSet)

@objc(removeBudgets:)
@NSManaged public func removeFromBudgets(_ values: NSSet)

}

所以我假设我可以只使用“addToBudgets”来添加一组数据,它似乎确实有效,但仅适用于一个实例。

我在哪里添加

因此,我在 HistoryBudgetHolderMO 上执行了一个获取请求,以查看数据库中是否有任何内容。如果没有,那么我从我的 App Delegate 创建一个新的(请注意:我已经在上面的方法中完成了 App Delegate 转换等,然后将 App Delegate 和 Context 传递给了这个方法)

private func SaveAndDeleteCurrentBudget(context : NSManagedObjectContext, appDele : AppDelegate){
let fetchHistory : NSFetchRequest<HistoryBudgetHolderMO> = HistoryBudgetHolderMO.fetchRequest()

//Saves the budget to the history budget. If we don't have oen we created one and add it to that
do{
let historyBudgets : [HistoryBudgetHolderMO] = try context.fetch(fetchHistory)
if historyBudgets.count <= 0{
let newHistoryBudget : HistoryBudgetHolderMO = HistoryBudgetHolderMO(context: context)
newHistoryBudget.addToBudgets(budgetData.first!)
print("entered new historyBudget")
}else{
historyBudgets.first!.addToBudgets(budgetData.first!)
}
appDele.saveContext()
}catch{
print("Error when looking for history fetch result")
}

//Deletes all budget data and budget entries that are currently used
for object in budgetData{
context.delete(object)
}

let fetchAllDataEntries = NSFetchRequest<NSFetchRequestResult>(entityName: "BudgetEntry")
let deleteReq = NSBatchDeleteRequest(fetchRequest: fetchAllDataEntries)

do{
try context.execute(deleteReq)
}catch{
print("Error when deleting budget entries")
}
appDele.saveContext()
}
  1. 我执行获取请求并检查历史实体是否存在。如果没有,那么我创建一个新的,添加预算条目,然后保存上下文。
  2. 如果没有,那么我会获取历史记录持有者的第一个实例(因为它只是一个容器,所以永远应该只有一个),然后添加预算条目,然后保存。

哪里变坏了

所以我第一次这样做时它处于状态 2,我得到一个 Optional(1) 的值,这意味着它已经存储了一个历史条目。然而,在此之后的任何更多添加都继续说它是可选的(1)。我已经尝试查找无数解决方案,尝试弄乱扩展等。我认为这将是一个简单的 Get/Set 操作,但它就是行不通。

如有任何帮助,我们将不胜感激。

感谢您花时间阅读本文。

最佳答案

您的解决方案现在看来不错。我还建议去掉 HistoryBudgetHolderMO 类。我可以建议向 NewBudget 类添加另一个字段/属性:creationDate(日期类型)。这样你就可以随时获取最新的(例如获取所有这些并按创建日期排序)。您还可以添加一个事件/历史 bool 属性以将预算标记为事件/非事件。另一个建议是尽量避免强制展开。而不是写

budgetData.first!.attributeName 

尝试使用“if let”结构

if let budget = budgetData.first {
budget.attributeName
}

关于ios - 一对多关系 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43426504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com