Как извлечь все дочерние элементы из родительского объекта из основных данных и как я могу использовать родительские данные в качестве UITableview - PullRequest
0 голосов
/ 16 мая 2019

Я устанавливаю parent как разделы, а child - как число строк в разделе, но при извлечении дочернего элемента из каждого родителя родитель, у которого есть только один дочерний элемент, отображает более одного, мой код должен извлекать данные из базовых данных

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, что может быть хорошим решением для этого.

1 Ответ

0 голосов
/ 16 мая 2019

Вам не нужно извлекать сущности папок, так как вы определили отношение один-ко-многим между Project и папками, это обрабатывается базовыми данными

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
}

Приведенный выше код был изменен непосредственно в веб-браузере и не скомпилирован, поэтому он может быть не точным, но, надеюсь, достаточно помочь вам решить эту проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...