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

Posted

技术标签:

【中文标题】我需要帮助将 Core Data 的结果放入 Swift 3 中的数组中【英文标题】:I need help getting results from Core Data into an array in Swift 3 【发布时间】:2016-10-07 04:05:21 【问题描述】:

我正在从 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:[(实体: CST项目详情;编号:0xd000000000080004 ;数据:),(实体: CST项目详情;编号:0xd0000000000c0004 ;数据:),(实体: CST项目详情;编号:0xd000000000100004 ;数据:),(实体: CST项目详情;编号:0xd000000000140004 ;数据:),(实体: CST项目详情;编号:0xd000000000180004 ;数据:)]

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

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

这实际上会打印出从 Core Data 中提取的正确数量的项目。

如果我这样做:

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)

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

谁能告诉我我在这里缺少什么?如何将 NSFetchRequest 中的值放入数组中?

【问题讨论】:

【参考方案1】:

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

您不必将任何东西“放入”数组中。调用fetch 的结果一个数组。你有一个数组开始。

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

for logDetails in hrData 

Swift 没有任何关于 logDetails 的信息,甚至 。它只是将其键入为 AnyObject。

如果您想提取它的 species 属性,您需要将您的 logDetails 转换回它的真实内容,即 CSTProjectDetails。

或者,不要强制转换为 NSArray,因为这会擦除您的元素类型信息。转换为 CSTProjectDetails 的 Swift 数组。现在 Swift 将从一开始就拥有类型信息。

【讨论】:

我不确定我是否理解。我怎么知道 logDetails 到底是什么?如果我要注释掉我的 do/try/catch 函数下面的所有内容,我究竟需要做什么来获取结果? n/m。在我看到你所做的更新之前,我写了我之前的评论。这现在更有意义了。【参考方案2】:

试试这个

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
    

【讨论】:

以上是关于我需要帮助将 Core Data 的结果放入 Swift 3 中的数组中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 时是不是需要本地数组?

需要一点帮助来理解 Apple 关于 Core Data 的文档

SwiftUI - Core-Data - 在这种特殊情况下访问包装的值

使用Core Data将文本从文本字段分配到托管对象上下文

将 Core Data 中的一对多显示为一对一

Swift 3 Core Data - 获取结果控制器