【问题标题】:I need help getting results from Core Data into an array in Swift 3我需要帮助将 Core Data 的结果放入 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 中的值放入数组中?

【问题讨论】:

    标签: arrays core-data swift3 xcode8


    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2014-03-12
      • 2020-06-25
      • 2021-10-24
      • 2020-11-25
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多