无法使用 Swift 在 CoreData 中访问一对多关系

Posted

技术标签:

【中文标题】无法使用 Swift 在 CoreData 中访问一对多关系【英文标题】:Can't access one-to-many relationships in CoreData using Swift 【发布时间】:2014-06-20 14:13:54 【问题描述】:

Swift 让我终于尝试了 ios 开发,但我在使用 CoreData 时遇到了一些问题。我没有运气尝试访问映射到我的一对多关系的属性。

我已经建立了这样的一对多关系:

@objc(Project)
class Project: NSManagedObject 

    @NSManaged var name:String

    @NSManaged var scribbles : Array<Scribble>



@objc(Scribble)
class Scribble: NSManagedObject 

    @NSManaged var notes:String

    @NSManaged var project:Project


我这样获取数据:

let request = NSFetchRequest(entityName: "Projects");
request.returnsObjectsAsFaults = false;
request.includesSubentities = true;

var results:NSArray = context.executeFetchRequest(request, error: nil);
for project in results

     let thisProject:Project = project as Project;
     projects.append(thisProject);

但每当我尝试使用 for..in 迭代项目的涂鸦时,我都会收到以下异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Scribble count]: unrecognized selector sent to instance 

当我在我的项目对象上 println 时,我似乎得到了一些东西,我只是不知道如何处理它。

<Project: 0xb48e010> (entity: Projects; id: 0xb48d340 <x-coredata://CDEFAC19-4D9E-426D-B0CC-EFFEE9053707/Projects/p3> ; data: 
name = Larry;
scribbles = "0xb48e7b0 <x-coredata://CDEFAC19-4D9E-426D-B0CC-EFFEE9053707/Scribbles/p3>";

)

【问题讨论】:

不确定这是否是导致您的异常的原因,但您不能将数组存储在核心数据中 - 只能存储 NSSet 或 NSOrderedSet。 @alivingston 我尝试将其更改为 NSSet,但这并没有成功。我得到了原因:'-[Scribble countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xb490220'。 你能发布导致异常的 for in 的代码吗? 几乎只是“用于项目中的涂鸦[index].scribbles...” 【参考方案1】:

从抛出的异常来看,您似乎正在尝试迭代一个集合,但 project.scribbles 返回一个集合,它返回一个 Scribble 实例。

这让我认为您的关系在数据建模器中设置为“一对一”。确保您已将关系设置为“to many”。您可以通过选择关系来做到这一点,数据模型检查器中将有一个名为 type 的选项 - 默认情况下设置为“to one”。

【讨论】:

以上是关于无法使用 Swift 在 CoreData 中访问一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

无法在 CoreData swift 中保存数据

无法在 AppDelegate coredata,Swift 2 中使用(域,代码,userInfo)调用类型“NSError”的初始化程序

Swift、CoreData 和多对多关系:如何访问子项的顺序?

Swift 4,CoreData:错误:无法加载名为 textTabelView 的模型

CoreData 无法正确“创建 NSManagedObject 子类”Swift

CoreData:警告:无法加载名为的类