swift中的核心数据关系

Posted

技术标签:

【中文标题】swift中的核心数据关系【英文标题】:Core data Relationship in swift 【发布时间】:2016-02-24 15:43:27 【问题描述】:

我正在开发 iPhone 应用程序,我需要在其中实现从一个实体到另一个实体的一对多关系。我已经从 coredata 数据库导出 NSManagedObject 子类,但在诸如 Objective-C 的核心数据模型文件中找不到关系访问器.

虽然我可以在关系 NSSet 中设置数据,但这只会在 iPhone 应用程序运行时持续存在。一旦我杀死并重新启动应用程序,我就没有从核心数据获取请求中获得实体关系。

我不确定我做错了什么。如果有人能告诉我如何在NSSet 关系对象中设置数据,那就太好了。任何示例都会有很大帮助

这是我的核心数据模型文件。一个文件夹可以包含多个内容作为文件夹详细信息

extension FolderContent 

    @NSManaged var contentID: NSNumber?
    @NSManaged var contentTitle: String?
    @NSManaged var contentType: String?
    @NSManaged var publishDate: String?
    @NSManaged var folderList: NSSet?



extension FolderList 

    @NSManaged var folderID: NSNumber?
    @NSManaged var folderName: String?
    @NSManaged var folderDetail: NSSet?



func updateFolderList()

    // Initialize Fetch Request
    let fetchRequest = NSFetchRequest()

    // Create Entity Description
    let entityDescription = NSEntityDescription.entityForName(FOLDER_LIST, inManagedObjectContext: self.managedObjectContext)

    // Configure Fetch Request
    fetchRequest.entity = entityDescription

    do 
        let result = try self.managedObjectContext.executeFetchRequest(fetchRequest).last as! FolderList

        let content = result.mutableSetValueForKey("folderDetail")
        content.addObject(self.getContent())

          var folderContent:FolderContent = result.folderDetail?.allObjects.first as! FolderContent
        print(folderContent.contentTitle)
        self.save()

        print(result)

     catch 
        let fetchError = error as NSError
        print(fetchError)
    


    func getContent()->FolderContent

    let folderContent = NSEntityDescription.insertNewObjectForEntityForName(FOLDER_CONTENT, inManagedObjectContext: self.managedObjectContext) as! FolderContent
    folderContent.contentID = 1
    folderContent.contentTitle = "Sandeep"
    folderContent.contentType = "Product"
    return folderContent

【问题讨论】:

您的意思是您无法仅获取关系记录还是您保留在数据库中的全部记录? 我只获取关系记录失败。 如果是这种情况,当您将记录保存到核心数据中时会出现问题。请参考Saving CoreData to-many relationships in Swift。也许你可以从那里得到一些答案。 我已经尝试过了,但没有成功。你能给我任何示例我如何更新或插入到 NSSet 关系对象中? 一个FolderContent有很多FolderList; FolderList 属于 FolderContent。我理解你的记录的关系正确吗? 【参考方案1】:

如果FolderContent和FolderList的关系定义为

一个 FolderContent 有许多 FolderList(s) 一个 FolderList 只属于一个 FolderContent

文件夹内容

extension FolderContent 
    @NSManaged var contentID: NSNumber?
    @NSManaged var contentTitle: String?
    @NSManaged var contentType: String?
    @NSManaged var publishDate: String?
    @NSManaged var folderList: Set<FolderList>?

文件夹列表

extension FolderList 
    @NSManaged var folderID: NSNumber?
    @NSManaged var folderName: String?
    @NSManaged var folderDetail: FolderContent?

假设您想保留记录及其关系

func persistRecords() 

    // Insert the new records
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext

    let folderContentEntity = NSEntityDescription.entityForName("FolderContent", inManagedObjectContext: managedContext)
    let folderListEntity = NSEntityDescription.entityForName("FolderList", inManagedObjectContext: managedContext)

    //Create FolderContent record
    let folderContentObject = FolderContent(entity: folderContentEntity!, insertIntoManagedObjectContext: managedContext)
    folderContentObject.setValue(CONTENTID, forKeyPath: "contentID")
    ...

    //Create FolderList record
    let folderListObject = FolderList(entity: folderListEntity!, insertIntoManagedObjectContext: managedContext)
    folderListObject.setValue(FOLDERID, forKeyPath: "folderID")
    ...

    //Set relationship here
    folderListObject.folderDetail = folderContentObject

    do 
      try managedContext.save()
     catch let error as NSError  
      print("Could not save \(error), \(error.userInfo)")
    
  

【讨论】:

感谢 David 提供完整的详细信息。您能告诉我如何更新和删除关系对象吗? 您可以从这里andrewcbancroft.com/2015/02/18/…了解如何更新和删除方法【参考方案2】:

我猜你做了类似folder.folderDetail.addObject 的事情。核心数据不起作用,因为幕后的核心数据正在做很多事情来维护图形的完整性。您必须使用mutableSetValueForKey 来获取集合并让核心数据发挥其魔力。

【讨论】:

我已经更新了我的问题。您可以检查我是如何在关系中设置数据的。我的一个问题是 result.mutableSetValueForKey("folderDetail") 是如何工作的,核心数据如何知道“folderDetail”作为可变键?它是我们需要在某个地方定义的东西吗? 您必须在核心数据模型编辑器中定义您的实体和关系。否则它永远不会起作用。我认为你必须退后一步,从一开始就阅读一些关于设置基于核心数据的应用程序的教程。在模型中定义 folderDetail 将是您首先要做的事情之一。

以上是关于swift中的核心数据关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IOS Swift 中获取核心数据中的多对多关系?

Swift核心数据多对多关系不保存实体

swift 3 - 核心数据关系 - 获取数据

iOS (Swift):使用关系获取核心数据

Swift 核心数据关系和种子数据

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