无法在多对多属性中加载核心数据
Can't load Core Data in to-many attribute
我一直无法在一对多中添加和读取核心数据属性
关系。在阅读了许多 SO、Apple Docs 和其他文章后,我仍然有
没有做到这一点。为了做一个简单的测试,我创建了一个标准的Master Detail
带有核心数据的应用程序。这对主要实体没有问题。
核心数据关系如下图。
这是将一些测试数据放入商店的代码。请注意,我是
尝试为每个 InvItem 添加对多数据作为 Set 并使
keywordList 属性可转换。我认为这是最好的方法,但是
显然这在这里不起作用。
func seedInvItems(num : Int) {
for index in 1...num {
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName("InvItem", inManagedObjectContext: kAppDelegate.managedObjectContext) as! InvItem
newManagedObject.name = "myName\(index)"
newManagedObject.category1 = "myCategory1x\(index)"
newManagedObject.compartment = "myCompartment\(index)"
newManagedObject.entryDate = NSDate()
//and for the one-to-many relationship
var myStoreKeywordSet = Set<String>()
myStoreKeywordSet = ["one","two","three"]
// do an insert just for grins
myStoreKeywordSet.insert("four")
let newManagedObject2 = NSEntityDescription.insertNewObjectForEntityForName("InvItemKeyword", inManagedObjectContext: kAppDelegate.managedObjectContext) as! InvItemKeyword
newManagedObject2.keywordList = myStoreKeywordSet
}//for in
kAppDelegate.saveContext()
let fetchRequestTest = NSFetchRequest(entityName: "InvItem")
let sorter : NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
fetchRequestTest.sortDescriptors = [sorter]
var resultsTest : [InvItem]?
do {
resultsTest = try kAppDelegate.managedObjectContext.executeFetchRequest(fetchRequestTest) as? [InvItem]
for object in resultsTest! {
let myRetrieveKeywordSet = object.invitemkeywords
print(myRetrieveKeywordSet)
}//for in
} catch let error as NSError {
//what happens on failure
print("And the executeFetchRequest error is \(error.localizedDescription)")
}//do catch
}//seedInvItems
为了完整起见,我确实为核心创建了 NSManagedObject 子类
数据实体。
当 运行 应用程序时,InvItem 的主详细信息按预期运行,但我
不存储对多项目。
这是控制台日志(针对一个 InvItem):
可选(关系 'invitemkeywords' 托管对象 (0x7f985a62bb70) 故障(实体:InvItem;id:0xd0000000000700000;数据:{
类别 1 = 我的类别 1x3;
隔间=我的隔间3;
entryDate = "2016-02-09 02:10:21 +0000";
invitem关键字=“”;
名字=我的名字3;
}))
查看数据库,关键字列表没有数据。
如有任何帮助,我们将不胜感激。 Xcode7.2.1IOS9.2
您需要设置从newManagedObject
到newManagedObject2
的关系。其实因为是一对多的关系,设置一对一的关系更容易:
newManagedObject2.invitem = newManagedObject
并让 CoreData 处理反向的对多关系。
关于keyWordList
没有被填充,不知你的SQL浏览器是否无法解码CoreData的NSSet?我还想知道您是否需要将 keywordList
作为 NSSet
?来自 InvItem
的关系已经是一对多关系,因此您的模型暗示每个 InvItem
可以有许多 InvItemKeywords
,每个 InvItemKeywords
在其 keywordList
属性中包含许多关键字:是那是你想要的吗?
我一直无法在一对多中添加和读取核心数据属性 关系。在阅读了许多 SO、Apple Docs 和其他文章后,我仍然有 没有做到这一点。为了做一个简单的测试,我创建了一个标准的Master Detail 带有核心数据的应用程序。这对主要实体没有问题。
核心数据关系如下图。
这是将一些测试数据放入商店的代码。请注意,我是 尝试为每个 InvItem 添加对多数据作为 Set 并使 keywordList 属性可转换。我认为这是最好的方法,但是 显然这在这里不起作用。
func seedInvItems(num : Int) {
for index in 1...num {
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName("InvItem", inManagedObjectContext: kAppDelegate.managedObjectContext) as! InvItem
newManagedObject.name = "myName\(index)"
newManagedObject.category1 = "myCategory1x\(index)"
newManagedObject.compartment = "myCompartment\(index)"
newManagedObject.entryDate = NSDate()
//and for the one-to-many relationship
var myStoreKeywordSet = Set<String>()
myStoreKeywordSet = ["one","two","three"]
// do an insert just for grins
myStoreKeywordSet.insert("four")
let newManagedObject2 = NSEntityDescription.insertNewObjectForEntityForName("InvItemKeyword", inManagedObjectContext: kAppDelegate.managedObjectContext) as! InvItemKeyword
newManagedObject2.keywordList = myStoreKeywordSet
}//for in
kAppDelegate.saveContext()
let fetchRequestTest = NSFetchRequest(entityName: "InvItem")
let sorter : NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
fetchRequestTest.sortDescriptors = [sorter]
var resultsTest : [InvItem]?
do {
resultsTest = try kAppDelegate.managedObjectContext.executeFetchRequest(fetchRequestTest) as? [InvItem]
for object in resultsTest! {
let myRetrieveKeywordSet = object.invitemkeywords
print(myRetrieveKeywordSet)
}//for in
} catch let error as NSError {
//what happens on failure
print("And the executeFetchRequest error is \(error.localizedDescription)")
}//do catch
}//seedInvItems
为了完整起见,我确实为核心创建了 NSManagedObject 子类 数据实体。
当 运行 应用程序时,InvItem 的主详细信息按预期运行,但我 不存储对多项目。
这是控制台日志(针对一个 InvItem):
可选(关系 'invitemkeywords' 托管对象 (0x7f985a62bb70) 故障(实体:InvItem;id:0xd0000000000700000;数据:{ 类别 1 = 我的类别 1x3; 隔间=我的隔间3; entryDate = "2016-02-09 02:10:21 +0000"; invitem关键字=“”; 名字=我的名字3; }))
查看数据库,关键字列表没有数据。
如有任何帮助,我们将不胜感激。 Xcode7.2.1IOS9.2
您需要设置从newManagedObject
到newManagedObject2
的关系。其实因为是一对多的关系,设置一对一的关系更容易:
newManagedObject2.invitem = newManagedObject
并让 CoreData 处理反向的对多关系。
关于keyWordList
没有被填充,不知你的SQL浏览器是否无法解码CoreData的NSSet?我还想知道您是否需要将 keywordList
作为 NSSet
?来自 InvItem
的关系已经是一对多关系,因此您的模型暗示每个 InvItem
可以有许多 InvItemKeywords
,每个 InvItemKeywords
在其 keywordList
属性中包含许多关键字:是那是你想要的吗?