添加到托管对象有序集中

Posted

技术标签:

【中文标题】添加到托管对象有序集中【英文标题】:Adding to Managed Object Ordered Set 【发布时间】:2015-06-22 17:58:20 【问题描述】:

我有一个包含两个实体的测试应用程序,文件夹与另一个名为 List 的对象的关系为 To Many

在我的故事板中,我有一个带有已创建文件夹列表的 tableview 控制器。当点击一个文件夹时,我会转到另一个 TableView 传递 selectedFolder,它应该显示保存到 selectedFolder 的 List 有序集。我有一个似乎将项目添加到列表的模式。

很遗憾,我无法将列表保存到 selectedFolder 有序集中。执行保存功能时收到错误unrecognized selector sent to instance 这个错误是因为以下行:

selectedFolder.list = list.copy() as! NSOrderedSet

我不确定我在保存功能方面做错了什么,并且想知道是否有人可以提供帮助,我将不胜感激。

文件夹子类:

class Folder: NSManagedObject 

@NSManaged var title: String
@NSManaged var details: String
@NSManaged var date: NSDate
@NSManaged var list: NSOrderedSet


列出子类

class List: NSManagedObject 

@NSManaged var item: String
@NSManaged var folder: Event


模态视图将列表添加到选定的文件夹有序集。

class PopoverViewController: UIViewController 

//selectedFolder passed from segue. Works fine displays title of folder
var selectedFolder: Folder!

@IBOutlet weak var popoverTextField: UITextView!

override func viewDidLoad() 
    super.viewDidLoad()
    self.popoverTextField.becomeFirstResponder()
    // Do any additional setup after loading the view.



@IBAction func addListItem(sender: AnyObject) 

    //Get the context
    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    //get entity details
    let entity = NSEntityDescription.entityForName("List", inManagedObjectContext: moc!)

    //Create the managed object to be inserted
    let list = List(entity: entity!, insertIntoManagedObjectContext: moc!)

    // Add Text 

    list.item = popoverTextField.text

    //Insert the new checklist into the folder set

    var folder = selectedFolder.list.mutableCopy() as! NSMutableOrderedSet
    folder.addObject(list)

    selectedFolder.list = list.copy() as! NSOrderedSet

    //Error check & Save

    var error: NSError?
    if moc!.save(&error)
      println("Could not save: \(error)")
    

【问题讨论】:

你的代码崩溃了吗?你是如何使用副本的,是否可以将副本与 NSManagedObject 一起使用?您应该使用生成的核心数据方法或使用 kvc 获取 mutableSetValueForKey: 目标对象上的方法来获取可变集。 Folder 类是您所说的Event 吗? Folderlist 属性是否被描述为 checklist?? list.copy() 分配给selectedFolder.list 毫无意义,您的意思是selectedFolder.list = folder 吗? @MartinR 抱歉更新了代码。我把它改成了selectedFolder.list = folder,我相信现在可以了。只是修复另一个错误以将 Set 视为数组。 @JUSDEV:这就是我提供的答案,以及替代解决方案:) 【参考方案1】:
var folder = selectedFolder.list.mutableCopy() as! NSMutableOrderedSet
folder.addObject(list)
selectedFolder.list = list.copy() as! NSOrderedSet

最后一个赋值没有意义,因为list 是一个List 对象而不是(有序)集合,顺便说一句。这将计算一个 folder 变量 然后被忽略。

你可能的意思(这应该有效)是

var folder = selectedFolder.list.mutableCopy() as! NSMutableOrderedSet
folder.addObject(list)
selectedFolder.list = folder

正如评论中已经提到的,添加到有序关系 有点棘手,但可以通过 Key-Value 编码来完成

let mutableChecklist = selectedFolder.mutableOrderedSetValueForKey("list")
mutableChecklist.addObject(list)

(比较 Exception thrown in NSOrderedSet generated accessors 和 Setting an NSManagedObject relationship in Swift。)

然而,在一对多关系的情况下,最简单的方法 就是设置关系的其他方向

list.folder = selectedFolder

【讨论】:

谢谢!对于使用核心数据的新 swift 开发人员来说资源并不多,因此只能通过反复试验来学习。

以上是关于添加到托管对象有序集中的主要内容,如果未能解决你的问题,请参考以下文章

将 COM 对象添加到托管代码

何时向托管对象添加类别以及何时使用瞬态属性?

java集合类

向托管对象添加手动关系

2022-04-20 WPF面试题 在WPF应用程序集中添加新文件时,Page和Window有什么区别?

2022-04-20 WPF面试题 在WPF应用程序集中添加新文件时,Page和Window有什么区别?