【问题标题】:How to fetch all childs from parent entity from core data, and how can i use the parent data as UITableview如何从核心数据中获取父实体的所有子实体,以及如何将父数据用作 UITableview
【发布时间】:2019-05-16 07:07:18
【问题描述】:

我将父级设置为节,子级设置为节中的行数,但是在从每个父级获取子级时,只有一个子级的父级显示多个,我的代码是从核心数据中获取数据

var projectsArray: [Project] = []
var foldersArray: [Folders] = []

let fetchRequest = NSFetchRequest<Project>(entityName: "Project")
let sortDescriptor = NSSortDescriptor(key: "pname", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]

let fetchFolders = NSFetchRequest<Folders>(entityName: "Folders")
let sortDesc = NSSortDescriptor(key: "name", ascending: true)
fetchFolders.sortDescriptors = [sortDesc]
do {
    let newProjectArray = try managedContext.fetch(fetchRequest)
    projectsArray = newProjectArray
    for newObj in projectsArray{
        if let projectId = newObj.id{
            fetchFolders.predicate = NSPredicate(format: "pid = %@",projectId)
        }
        do {
            foldersArray = try managedContext.fetch(fetchFolders)
            print("The folders are",foldersArray as Any)
        }catch{}
    }
}catch let error as NSError {
    print("Could not fetch. \(error), \(error.userInfo)")
    projectsArray = []
}

在我的控制器中,我正在阅读,

func numberOfSections(in tableView: UITableView) -> Int {
    return (newProjectArray != nil) ? newProjectArray!.count : 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection
        section: Int) -> Int {
        if newProjectArray![section].isExpandable == true{
            return (folders != nil) ? (folders!.count) : 0
        }
        else{
            return 0
        }
    }
    func tableView(_ tableView: UITableView, heightForHeaderInSection
        section: Int) -> CGFloat {
        return 40
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath:
        IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier:
            "FoldersCell") as! FoldersCell
        if  newProjectArray![indexPath.section].isExpandable == true{
            let folder  = folders![indexPath.row]
            cell.projectNameLabel.text = folder.name
        }
        return cell
    }

假设名为ABC 的项目包含一个folder,而项目XYZ 包含folder1,folder2,folder3,在显示单元格ABC 时它正在显示folder,folder1,folder2,folder3,而在显示单元格XYZ 时它正在显示folder,folder1,folder2,folder3,那么有什么好的解决方案。

【问题讨论】:

  • 您是否在核心数据模型中的 Project 和 Folders 实体之间建立了关系?
  • 是 Joakim,从项目到文件夹的一对可能关系
  • 那么您不需要为文件夹单独执行提取,您可以直接在let projectFolders = project.folders 等代码中将它们作为属性访问。将 folders 替换为您在模型中命名的关系
  • 我也尝试过使用它,遇到同样的问题代码是for newObj in projectsArray{ let new = newObj.mutableSetValue(forKey: "folder") let myObj = new.allObjects as? [Folders] for i in myObj!{ if newObj.isExpandable{ if newProjectArray.contains(newObj) { foldersArray.append(i) } } } }
  • 要发表评论的代码太多,我会发布一个答案。

标签: ios swift uitableview


【解决方案1】:

您不需要获取文件夹实体,因为您已经在项目和文件夹之间定义了由 Core Data 处理的一对多关系

let fetchRequest = NSFetchRequest<Project>(entityName: "Project")
let sortDescriptor = NSSortDescriptor(key: "pname", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]

do {
    let newProjectArray = try managedContext.fetch(fetchRequest)
}catch let error as NSError {
    print("Could not fetch. \(error), \(error.userInfo)")
}

在其他代码中

func numberOfSections(in tableView: UITableView) -> Int {
    return (newProjectArray != nil) ? newProjectArray!.count : 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection
    section: Int) -> Int {
    if newProjectArray![section].isExpandable, let folders =  newProjectArray![section].folders { 
        return folders.count
    } 
    else{
        return 0
    }
}

func tableView(_ tableView: UITableView, heightForHeaderInSection
    section: Int) -> CGFloat {
    return 40
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath:
    IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:
        "FoldersCell") as! FoldersCell
    if  newProjectArray![indexPath.section].isExpandable == true {
        if let folders = newProjectArray![indexPath.section].folders {
            folder = folders[indexPath.row]
            cell.projectNameLabel.text = folder.name
        }
    }
    return cell
}

以上代码已直接在网络浏览器中更改,未编译,因此可能不完全准确,但希望足以帮助您解决此问题

【讨论】:

  • 嗨 Joakim,非常感谢,你救了我的命,太棒了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多