繁体   English   中英

我需要帮助,将Core Data中的结果放入Swift 3的数组中

[英]I need help getting results from Core Data into an array in Swift 3

我正在从Core Data中进行简单的提取,并使用以下谓词过滤结果:

do {
    let request: NSFetchRequest<CSTProjectDetails> = CSTProjectDetails.fetchRequest()
    request.predicate = NSPredicate(format: "projectID == %@", cstProjectID)
    cstProjectDetails = try context.fetch(request)
} catch {
    print("There was an error fetching CST Project Details.")
}

当我尝试打印以下详细信息时,会得到以下信息。

print("CSTProjectDetails: \(cstProjectDetails)")

这将产生如下内容:

CSTProjectDetails:[(实体:CSTProjectDetails; id:0xd000000000080004;数据:),(实体:CSTProjectDetails; id:0xd0000000000c0004;数据:),(实体:CSTProjectDetails; id:0xd000000000100004;数据:),(实体:CSTProjectDetails; id4x4000 ; data:),(entity:CSTProjectDetails; id:0xd000000000180004; data:)]


我尝试将“ cstProjectDetails”转换为数组,并对结果进行一些测试:

let hrData = self.cstProjectDetails as NSArray
print("There are \(hrData.count) items in this project")

这实际上将打印出从核心数据中提取的正确数量的项目。

如果我这样做:

dump(hrData)

我得到这样的东西:

  • (实体:CSTProjectDetails; id:0xd000000000080004;数据:)#1
    • 超级:LogsterBeta3.CSTProjectDetails
      • 超级:NSManagedObject
    • (实体:CSTProjectDetails; id:0xd0000000000c0004;数据:)#2
    • 超级:LogsterBeta3.CSTProjectDetails
      • 超级:NSManagedObject
    • (实体:CSTProjectDetails; id:0xd000000000100004;数据:)#3
    • 超级:LogsterBeta3.CSTProjectDetails
      • 超级:NSManagedObject
    • (实体:CSTProjectDetails; ID:0xd000000000140004;数据:)#4
    • 超级:LogsterBeta3.CSTProjectDetails
      • 超级:NSManagedObject
    • (实体:CSTProjectDetails; id:0xd000000000180004;数据:)#5
    • 超级:LogsterBeta3.CSTProjectDetails
      • 超级:NSManagedObject

综上所述,我试图使用如下所示的循环访问实体的属性:

for logDetails in hrData {
    print (logDetails.species)
}

但是,这会立即产生错误,说明“物种”不是有效的成员。

有人可以让我知道我在这里想念的吗? 如何将NSFetchRequest中的值放入数组中?

如何将NSFetchRequest中的值放入数组中?

您不必“将”任何东西“放入数组”。 调用fetch的结果一个数组。 您首先需要一个数组。

然后,您做了一件很奇怪的事情:将hrData转换为NSArray。 好吧,NSArray没有元素类型。 所以现在当你说

for logDetails in hrData {

斯威夫特没有关于什么的任何信息logDetails甚至 它只是将其键入为AnyObject。

如果要提取其species属性,则需要将logDetails回实际值,即CSTProjectDetails。

另外, 不要强制转换为NSArray,因为这会删除您的元素类型信息。 向下转换为CSTProjectDetails的Swift数组。 现在,Swift将从一开始就提供类型信息。

尝试这个

class TableViewVC: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate {

@IBOutlet weak var tableView: UITableView!

var cstProject: CstProjectDetails?
var cstProjectDetails = [CstProjectDetails]()
let controller = CoredataController()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        cstProjectDetails = controller.fetchCstProjectDetails()
    }

    override func viewDidAppear(_ animated: Bool) {
        tableView.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cstProjectDetails.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "CstProjectDetailsCell", for: indexPath) 

            self.cstProject = cstProjectDetails[indexPath.row]
            cell.configureCell(cstProjectDetails: cstProject!)
            return cell
}

class CoredataController: NSObject, NSFetchedResultsControllerDelegate {

    func fetchCstProjectDetails() -> [CstProjectDetails] {

        var cstProjectDetails = [CstProjectDetails]()
        let fetchProject: NSFetchRequest<CstProjectDetails> = CstProjectDetails.fetchRequest()

        do {
            let fetchedResult = try context.fetch(fetchCstProjectDetails)

            for project in fetchedResult as [NSManagedObject] {
                cstProjectDetails.append(project as! CstProjectDetails)
            }

        } catch {

            let error = error as NSError
            print("ATTEMPT FETCH ERROR IS: \(error)")
        }
        return cstProjectDetails
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM