我整个下午都在苦苦挣扎。我可以在睡梦中用Obj-C做到这一点,但我似乎无法理解我在Swift中应该做的事情。我可以得到一个实体数组(StoredTopic),但我一直在尝试访问它们时遇到错误。
这里是获取代码:
func fetchCoreData(_ entityName:String) -> [NSManagedObject] {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return []
}
let managedContext =
appDelegate.persistentContainer.viewContext
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: entityName)
do {
let arrData = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
return []
}
这里是arrData的日志
[<StoredTopic: 0x6040000833e0> (entity: StoredTopic; id: 0xd000000000040000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p1> ; data: <fault>), <StoredTopic: 0x604000085960> (entity: StoredTopic; id: 0xd000000000080000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p2> ; data: <fault>), <StoredTopic: 0x604000083020> (entity: StoredTopic; id: 0xd0000000000c0000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p3> ; data: <fault>), <StoredTopic: 0x604000088de0> (entity: StoredTopic; id: 0xd000000000100000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p4> ; data: <fault>), <StoredTopic: 0x60000008c580> (entity: StoredTopic; id: 0xd000000000140000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p5> ; data: {
createDt = "2017-11-02 19:28:00 +0000";
segObj = 0;
segTopic = 0;
title = Test;
topicID = "4A55582B-3084-4ECA-8F61-C1193A85B45B";
"topic_desc" = 1234567890;
updateDt = "2017-11-02 19:28:00 +0000";
所以,如果我尝试做类似的事情:
arrData [0] .topicID我得到&#34;类型&#39; NSManagedObject&#39;没有会员&#39; topicID&#39;&#34;
如果我尝试通过添加此行来建议其他SO帖子:
var arrStoredTopic = [StoredTopic]()
arrStoredTopic = try managedContext.fetch(fetchRequest)
我得&#34;无法分配类型&#39; [NSManagedObject]&#39;输入&#39; [StoredTopic]&#39;&#34;
然后我尝试按照本教程进行操作,虽然它对某些调用有点过时,并改变了我的代码来跟随它:
func fetchCoreData(_ entityName:String) -> [NSManagedObject] {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return []
}
let managedContext = appDelegate.persistentContainer.viewContext
var fetchRequest = NSFetchRequest<NSFetchRequestResult>()
let entityDescription = NSEntityDescription.entity(forEntityName: entityName, in: managedContext)
fetchRequest.entity = entityDescription
do {
//let arrData = try managedContext.fetch(fetchRequest)
let results = try managedContext.fetch(fetchRequest)
if results.count > 0 {
let storedData = results[0] as! NSManagedObject
}
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
return []
}
仍然无法访问StoredTopic属性。
那么如何从Core Data中获取managedObjects以便我可以使用它们呢?我显然很困惑。
由于
答案 0 :(得分:1)
更改
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entityName)
到
let fetchRequest = NSFetchRequest<StoredTopic>(entityName: entityName)
或
let fetchRequest = StoredTopic.fetchRequest()
在您的原始代码中,您说获取请求将获取NSManagedObject
而不是StoredTopic
s,这就是您在访问属性和将获取请求的结果分配给{时遇到问题的原因{1}}。
Swift是一种类型安全的语言,所以它对Objective-C不担心的事情非常严格(直到它在运行时崩溃)。