我无法在一对多中添加和读取核心数据属性 关系。在阅读了许多SO,Apple Docs和其他文章之后我还有 没有完成这个。为了进行简单的测试,我创建了一个标准的Master Detail 应用核心数据。这对主要实体没有任何问题。
以下是将一些测试数据放入商店的代码。请注意我 尝试将to-many数据添加为每个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
为了完整起见,我确实为Core创建了NSManagedObject子类 数据实体。
运行应用程序时,InvItem的主要细节表现如预期,但我 没有存储多对项目。
这是控制台日志(对于一个InvItem):
可选(关系&#39; invitemkeywords&#39;托管对象上的错误(0x7f985a62bb70)(实体:InvItem; id:0xd000000000700000; data:{ category1 = myCategory1x3; compartment = myCompartment3; entryDate =&#34; 2016-02-09 02:10:21 + 0000&#34 ;; invitemkeywords =&#34;&#34 ;; name = myName3; }))
查看数据库,没有关键字列表的数据。
任何帮助将不胜感激。 Xcode 7.2.1 IOS 9.2
答案 0 :(得分:1)
您需要设置从newManagedObject
到newManagedObject2
的关系。事实上,因为这种关系是一对多的,所以设置一对一的关系更容易:
newManagedObject2.invitem = newManagedObject
让CoreData处理逆向对多关系。
至于keyWordList
没有被填充,我想知道你的SQL浏览器是否无法解码CoreData的NSSet?我也想知道您是否需要将keywordList
作为NSSet
? InvItem
之间的关系已经很多,因此您的模型意味着每个InvItem
可以包含多个InvItemKeywords
,每个keywordList
在其#
属性中包含许多关键字:is那是你的意图吗?