核心数据一对多插入与现有关系swift

Posted

技术标签:

【中文标题】核心数据一对多插入与现有关系swift【英文标题】:Core Data one-to-many insert with existing relationship swift 【发布时间】:2015-11-16 12:19:56 【问题描述】:

所以我有一个一对多的核心数据结构

extension Category 
@NSManaged var name: String?
@NSManaged var catHasExpenses: NSOrderedSet? 


extension Expenses 
@NSManaged var amount: NSNumber
@NSManaged var name: String?
@NSManaged var date: NSDate
@NSManaged var expenseHasCat: Category 

当应用程序启动时,我会插入所有类别。当我想插入一个新的费用时,它也会插入一个我不想要的新类别。我的插入代码:

func insertExpense(name: String?, amount: Double, date: NSDate, currentCat: Category) 

    // Fetch current cateogory
    let category: Category = self.fetchCurrentCategory(currentCat.name)!
    NSLog("\(category.name)") //I know I have the correct category here

    // Create new expense
    let expense = NSEntityDescription.insertNewObjectForEntityForName("Expenses", inManagedObjectContext: self.managedObjectContext) as! Expenses
    expense.expName = name
    expense.amount = amount
    expense.date = date
    expense.expenseHasCat = category

    do 
        try self.managedObjectContext.save()
     catch 
        NSLog("Error: \(error)")
    


func fetchCurrentCategory(selectedCat: String) -> Category? 

    let fetchRequest = NSFetchRequest(entityName:"Category")
    let predicate = NSPredicate(format: "name == %@", selectedCat)
    fetchRequest.predicate = predicate
    do
        if let fetchResults = try self.managedObjectContext.executeFetchRequest(fetchRequest) as? [Category] 
            return fetchResults[0]
        
    
    catch
        NSLog("Error: \(error)")
    

    return nil

我知道每次插入新费用时都会创建一个新类别,因为我会在应用程序开始时获取并计算每个实体。

如何在现有类别中插入新费用?

更多信息:

【问题讨论】:

请阅读本教程:raywenderlich.com/14742/… 您拥有的代码没有创建任何新的类别对象,因此您遇到的问题在其他地方。你确定你在启动时正确地做“插入所有类别”,而不是在那里复制它们吗? 不,我很确定只有在我插入新费用时才会创建新类别。我只在 entity.count = 0 时创建类别。我正在添加两张关于我的 xcdatamodeld 的照片。 【参考方案1】:

为什么Expenses(应该是Expense)有一个父实体Category?这意味着您可能不想要一些属性的继承,而且如果您依赖Category 实体的计数,那么所有Expenses 实体也将包含在计数中。

除非您真的有充分的理由,否则您通常不想在 Core Data 中进行实体继承。所有实体和继承的实体都存储在数据库的同一张表中,这对性能毫无帮助。

【讨论】:

这似乎解决了问题!这是我第一次使用 Core Data,在进行故障排除时我尝试了很多不同的方法。我显然忘记将其重置为原始设置,后来忽略了它。 可能有点投机取巧,但我在此处发布的 Core Data 存在另一个问题:***.com/questions/33704370/…

以上是关于核心数据一对多插入与现有关系swift的主要内容,如果未能解决你的问题,请参考以下文章

涉及新实体和一对多关系的核心数据迁移

在插入新的子对象时,父子对象传递与多级的一对多关系。 IOS核心数据

与 coredata 的一对多关系

一对多关系核心数据获取数据

核心数据:在一对多关系中匹配多个项目的组合

一对多关系核心数据获取数据