【问题标题】:How can I use a one-to-many relationship with coreData with Swift 2?如何在 Swift 2 中使用与 coreData 的一对多关系?
【发布时间】:2015-11-15 22:04:30
【问题描述】:

我对使用 coreData 相当陌生,并且已经破解了如何从单个实体保存和获取项目,但我似乎无法弄清楚如何从另一个具有“一对多”的实体保存和获取项目关系”与第一个。我花了很长时间(没有成功)尝试解决类似的问题,但更清晰的解释会非常有帮助。

我有一个名为 Group 的实体,它有 3 个属性。我的第二个实体称为客户。

一个组中可以有许多客户。我已经发送了 Group 实体以显示在 tableview 中,并且一切正常。我已经编写了代码,因此当有人点击 tableview 上的一行时,它会将他们带到一个新的 tableview 以显示属于该组的客户。

我的实体是如何设置的:

extension Group {
    @NSManaged var image: NSData?
    @NSManaged var name: String?
    @NSManaged var notes: String?
    @NSManaged var roundGroupRel: NSSet?
}
extension Customer {   
    @NSManaged var custName: String?
    @NSManaged var custJob: String?
    @NSManaged var custGroupRel: RoundName?
}

我的 prepareForSegue 代码尝试将我需要的信息发送到新的 tableViewController,以便我可以访问该特定组的客户信息:

     if segue.identifier == "custList" {
            let indexPath = self.myIndexPath //the indexPath generated when the user tapped on a row
            let itemController : CustomersTVC = segue.destinationViewController as! CustomersTVC
            let nRound : Group = frc.objectAtIndexPath(indexPath!) as! Group
            itemController.aRound = nRound
            itemController.myGroupIndexPath = indexPath    
        }

现在我可以对 Group 进行 fetch 请求:

import UIKit
import CoreData

class customerTVC: UITableViewController, NSFetchedResultsControllerDelegate {

    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    var frc : NSFetchedResultsController = NSFetchedResultsController()

    var myGroupIndexPath : NSIndexPath!
    var aRound : RoundName? = nil

override func viewDidLoad() {
        super.viewDidLoad()

        frc = getFetchedResultsController()
        frc.delegate = self
        do {
            try frc.performFetch()    
        } catch {
            print("Error: Failed to perform initial Fetch for Groups")
            return
        }

        let myGroup : Group = frc.objectAtIndexPath(myRoundIndexPath!) as! Group

        navigationItem.title = Group.name! +  " Customers:"
    }

    func getFetchedResultsController() -> NSFetchedResultsController {
        frc = NSFetchedResultsController(fetchRequest: roundFetchRequest(), managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        return frc
    }
    func roundFetchRequest() -> NSFetchRequest {
        let fetchRequest = NSFetchRequest(entityName: "Group")
        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]
        return fetchRequest
    }

这是我需要帮助的地方。如何访问此特定组的客户,而不是实体 Customer 中的所有条目?

我如何保存或添加另一个条目给这些客户?

我想我必须使用 Predicate 函数,但我无法确切知道它是什么或它是如何工作的。

您的帮助将不胜感激!

【问题讨论】:

    标签: ios core-data swift2 one-to-many


    【解决方案1】:

    如果您向我们展示您的数据模型会更好,但我假设以下集合表示组与客户之间的关系,该关系包含与特定组关联的所有客户。您无需再次从核心数据数据库中提取数据。只需显示此集合中的客户。

    @NSManaged var roundGroupRel: NSSet?
    

    【讨论】:

    • 这是我想学习的内容以及如何将某些内容保存到这个 NSSet 中? @beyowulf
    • 您的托管对象类是如何创建的?您是否单击了编辑器菜单->创建 NSManagedObject 子类?如果是这样,Xcode 会创建一些函数来将对象添加到您的 roundGroupRel 集合中。
    • 这就是它们的创建方式。你能给我一个例子来说明如何显示 NSSet 中包含的内容以及如何在集合中添加/编辑某些内容吗? @beyowulf
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多