我正在学习核心数据教程,我的代码抛出了以下错误。
无法将“nsAsynchronousFetchResult”(0x103e13388)类型的值强制转换为“nsArray”(0x10435cf28)。
2018-12-29 22:54:17.619639+0700 democoredata[2670:247527]无法将“nsAsynchronousFetchResult”(0x103e13388)类型的值强制转换为“nsArray”(0x10435cf28)。
(b)
我的问题是:
基于所提供的错误,我的应用程序失败的原因是什么?
以下是我无法编译的代码:
import UIKit
import CoreData
class ViewController: UIViewController {
@IBOutlet weak var txtID: UITextField!
@IBOutlet weak var txtTen: UITextField!
@IBOutlet weak var txtTuoi: UITextField!
@IBOutlet weak var lblKetQua: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func btnInsert(_ sender: Any) {
let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate // tạo biến để connect giữa iphone với Manage Object Context
let context: NSManagedObjectContext = appDel.persistentContainer.viewContext //tạo biến connect với db
//insert new Khach Hang
let newKH = NSEntityDescription.insertNewObject(forEntityName: "KhachHang", into: context) //insert new object
newKH.setValue(Int(txtID.text!), forKey: "id") //forKey = tên column
newKH.setValue(txtTen.text, forKey: "tenKH")
newKH.setValue(Int(txtTuoi.text!), forKey: "tuoiKH")
do {
try context.save()
print("Insert Success")
}catch {
let err = error as NSError
print("Error is: \(err)")
}
}
@IBAction func btnShow(_ sender: Any) {
let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate // tạo biến để connect giữa iphone với Manage Object Context
let context: NSManagedObjectContext = appDel.persistentContainer.viewContext // tạo biến connect với db
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "KhachHang")// tạo biến truy vấn đến table "KhachHang"
request.returnsObjectsAsFaults = false // có trả về những kết quả sai hay ko
do {
let results = try context.execute(request)
print("Truy Van Success")
for re in results as! [NSManagedObject] {
print(re.value(forKey: "tenKH"))
}
}catch {
let err = error as NSError
print("Excute err: \(err)")
}
}
}
这是我的*.xcdatamodeld文件
https://drive.google.com/open?id=18b1iJYz3jWAFkxYK2V4RrkxCTeWuR5yr
我真正想知道的是,如何独立调查此事。
提前感谢您的帮助!
最佳答案
从你的代码:
let results = try context.execute(request)
for re in results as! [NSManagedObject] {
print(re.value(forKey: "tenKH"))
}
您使用的
execute
方法返回NSPersistentStoreResult
的实例。这是一个抽象类。错误消息中提到的NSAsynchronousFetchResult
是NSPersistentStoreResult
的具体子类。接下来,尝试将其转换为
[NSManagedObject]
,这是一个不同的、不相关的类。您看到的错误发生的原因是无法将NSAsynchronousFetchResult
类型转换为数组,因为它们彼此不相关,甚至不相似。看起来您应该使用
fetch(request)
而不是execute(request)
,因为fetch
返回一个托管对象数组。我真正想知道的是,如何独自调查这个问题。
我不想提这个问题,但既然你问得很明确:这是你可以通过查看apple的文档来解决的问题,其中包含你正在使用的类和方法。记录了
execute
方法以返回与代码预期不同的内容,错误消息为问题的性质提供了很大的线索。