Ios swift中的核心数据关系

Ios swift中的核心数据关系,ios,iphone,swift,core-data,Ios,Iphone,Swift,Core Data,我正在开发iPhone应用程序,需要实现从一个实体到另一个实体的一对多关系。我从coredata数据库导出了NSManagedObject子类,但在核心数据模型文件(如Objective-C)中找不到关系访问器 虽然我能够在relationshipNSSet中设置数据,但这只在iPhone应用程序运行时才会持续。一旦我终止并重新启动应用程序,我就无法从核心数据中获取获取请求的实体关系 我不确定我做错了什么。如果有人能告诉我如何在NSSet关系对象中设置数据,那就太好了。任何示例都会有很大帮助 这

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

虽然我能够在relationship
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
}

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

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

如果FolderContent和FolderList的关系定义为

  • FolderContent具有多个FolderList
  • FolderList只属于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)")
    }
  }

如果FolderContent和FolderList的关系定义为

  • FolderContent具有多个FolderList
  • FolderList只属于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)")
    }
  }


您的意思是仅获取关系记录或保留在数据库中的全部记录失败吗?我仅获取关系记录失败。如果是这种情况,则在将记录保留到核心数据时会出现问题。请参阅。也许你可以从那里得到一些答案。我试过了,但没有成功。您能给我一些示例吗?如何更新或插入NSSet关系对象?一个
FolderContent
有许多
FolderList
FolderList
属于
FolderContent
。我是否正确理解了您的记录的关系?您的意思是仅获取关系记录或数据库中保留的全部记录失败吗?我仅获取关系记录失败。如果是这种情况,则在将记录保留到核心数据时存在问题。请参阅。也许你可以从那里得到一些答案。我试过了,但没有成功。您能给我一些示例吗?如何更新或插入NSSet关系对象?一个
FolderContent
有许多
FolderList
FolderList
属于
FolderContent
。我是否正确理解了你的记录的关系?我已经更新了我的问题。您可以检查我如何设置相关数据。我的一个问题是result.mutableSetValueForKey(“folderDetail”)如何工作核心数据如何将“folderDetail”作为可变键?这是我们需要在某个地方定义的东西吗?您必须在核心数据模型编辑器中定义您的实体和关系。否则它将永远不会起作用。我认为您必须后退一步,从一开始就阅读一些关于设置基于核心数据的应用程序的教程。在模型中定义folderDetail将是您首先要做的事情之一。您可以检查我如何设置相关数据。我的一个问题是result.mutableSetValueForKey(“folderDetail”)如何工作核心数据如何将“folderDetail”作为可变键?这是我们需要在某个地方定义的东西吗?您必须在核心数据模型编辑器中定义您的实体和关系。否则它将永远不会起作用。我认为您必须后退一步,从一开始就阅读一些关于设置基于核心数据的应用程序的教程。在模型中定义folderDetail将是您首先要做的事情之一。感谢David提供的全部详细信息。您能告诉我如何更新和删除关系对象吗?您可以从这里学习如何更新和删除方法感谢David提供的全部详细信息。您能告诉我如何更新和删除关系吗对象?您可以从这里学习如何更新和删除方法
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)")
    }
  }