[英]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的关系定义为
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.