我需要帮助将 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 中的数组中的主要内容,如果未能解决你的问题,请参考以下文章
需要一点帮助来理解 Apple 关于 Core Data 的文档