无法使用 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 中访问一对多关系的主要内容,如果未能解决你的问题,请参考以下文章
无法在 AppDelegate coredata,Swift 2 中使用(域,代码,userInfo)调用类型“NSError”的初始化程序
Swift、CoreData 和多对多关系:如何访问子项的顺序?
Swift 4,CoreData:错误:无法加载名为 textTabelView 的模型