[英]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.