简体   繁体   English

核心数据关系迅速

[英]Core data Relationship in swift

I am working on iPhone application where I need to implement one to many relationship from one entity to another entity.I have export NSManagedObject subclass from coredata database but could not find relation accessors in core data model file like Objective-C. 我正在iPhone应用程序上工作,我需要实现从一个实体到另一个实体的一对多关系。我已经从coredata数据库中导出了NSManagedObject子类,但在像Objective-C这样的核心数据模型文件中找不到关系访问器。

Although I'm able to set data in relationship NSSet but this only persist while iPhone app is running. 虽然我可以在关系NSSet设置数据,但这仅在iPhone应用程序运行时持续存在。 Once I kill and restart the application I didn't get entity relationship for in fetch request from core data. 一旦我杀死并重启了应用程序,我就没有从核心数据获取请求中的实体关系。

I am not sure what I am doing wrong. 我不确定自己在做什么错。 It will be great if anyone can tell me how to set data in NSSet relationship object. 如果有人可以告诉我如何在NSSet关系对象中设置数据,那就太好了。 Any sample example will be a great help 任何示例示例都会有很大帮助

Here is my core data model files. 这是我的核心数据模型文件。 One folder can content multiple content as folder detail 一个文件夹可以包含多个内容作为文件夹详细信息

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
}

If the relationship of FolderContent and FolderList is defined as 如果FolderContent和FolderList的关系定义为

  • A FolderContent have many FolderList(s) FolderContent有许多FolderList(s)
  • A FolderList only belongs to a FolderContent FolderList仅属于FolderContent

FolderContent 文件夹内容

在此处输入图片说明

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

FolderList 资料夹清单

在此处输入图片说明

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

Let say you want to persist the record and its relationship 假设您要保留记录及其关系

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)")
    }
  }

I am guessing you did something like folder.folderDetail.addObject . 我猜你做了类似folder.folderDetail.addObject事情。 With core data that won't work because core data behind the scenes is doing lots of things to maintain graph integrity. 使用核心数据将无法工作,因为后台的核心数据正在做很多事情来维护图形的完整性。 You have to use mutableSetValueForKey to get the set and have core data work its magic. 您必须使用mutableSetValueForKey来获取设置并让核心数据发挥作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM