Не удалось преобразовать значение типа «NSAsynchronousFetchResult» (0x103e13388) в «NSArray» (0x10435cf28) Swift - PullRequest
0 голосов
/ 29 декабря 2018

Я работаю над учебным пособием по основным данным, и мой код выдает следующую ошибку:

Не удалось преобразовать значение типа 'NSAsynchronousFetchResult' (0x103e13388) в 'NSArray' (0x10435cf28).2018-12-29 22: 54: 17.619639 + 0700 demoCoreData [2670: 247527] Не удалось преобразовать значение типа «NSAsynchronousFetchResult» (0x103e13388) в «NSArray» (0x10435cf28).(lldb)

Мой вопрос:

На основании предоставленной ошибки, по какой причине мое приложение не работает?

Вот мой код, который не будет компилироваться:

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

Что я действительно хотел бы знать, так это то, как это расследовать самостоятельно.Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 30 декабря 2018

Из вашего кода:

    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, возвращающий что-то отличное от того, что ожидает ваш код, а сообщение об ошибке дает большую подсказку о природе проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...