Swift: как получить данные ядра отношений по месяцам - PullRequest
1 голос
/ 25 мая 2020

Я новичок в Swift и нуждаюсь в вашей помощи.

У меня есть два контроллера представления с табличным представлением и две сущности, называемые группами и одиночными группами, с отношением один ко многим. У Entity Singlegroups есть атрибут из типа Дата.

В контроллере представления 1 (MasterViewController) я показываю все группы в моем TableView, а во втором контроллере представления (DetailViewController) я показываю все одиночные группы, связанные с группой выбранной строки.

Теперь я хочу загрузить SingleGroups во второй контроллер просмотра только с текущего месяца, но я не могу заставить его работать, потому что у меня нет FetchRequest во втором контроллере просмотра. Я передаю отдельные группы для выбранной строки в методе prepareForSegue.

Я пытался вызвать fetchRequest вручную тысячами разных способов, но ничего не случилось. Надеюсь, вы понимаете мою проблему и можете мне помочь.

DetailViewController TableView:

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return group?.singleGroups?.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = singleGroupTableView.dequeueReusableCell(withIdentifier: "SingleGroupsTableViewCell", for: indexPath) as! SingleGroupsTableViewCell
        
        let currencyFormatter = NumberFormatter()
        currencyFormatter.usesGroupingSeparator = true
        currencyFormatter.numberStyle = .currency
        currencyFormatter.locale = Locale.current
        currencyFormatter.positivePrefix = currencyFormatter.plusSign
        currencyFormatter.negativePrefix = currencyFormatter.minusSign

        if let singleGroup = group?.singleGroups?[indexPath.row] {
            cell.singleGroupNameLabel?.text = singleGroup.singleGroupName
            cell.singleGroupAmountLabel?.text = currencyFormatter.string(from: singleGroup.singleGroupAmount as NSNumber)
            cell.singleGroupAmountLabel.textColor = UIColor.red
            cell.singleGroupDateLabel?.text = DateHelper.convertDate(date: singleGroup.singleGroupTimeStamp)
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            deleteSingleGroup(at: indexPath)
        }
    }

ОБНОВЛЕНИЕ: Я решил это сам, написав новый запрос на выборку для объекта SingleGroups и изменив метод numbersOfRowsInSection моего представления таблицы.

    func orderFetchRequest() -> NSFetchRequest<NSFetchRequestResult> {

        let startDateFetch = Date().startOfMonth()
        let endDateFetch = Date().endOfMonth()

        self.startDate = startDateFetch!
        self.endDate = endDateFetch!

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "SingleGroups")
        let sortDescriptor = NSSortDescriptor(key: "singleGroupTimeStamp", ascending: false)
        let predicate1 = NSPredicate(format: "group == %@", group!)
        let predicate2 = NSPredicate(format: "singleGroupTimeStamp >= %@ AND singleGroupTimeStamp <= %@", startDate as CVarArg, endDate as CVarArg)

        let compound = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1, predicate2])
        fetchRequest.sortDescriptors = [sortDescriptor]
        fetchRequest.predicate = compound

        return fetchRequest
    }

    func fetchData() {

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let managedContext = appDelegate.persistentContainer.viewContext

        let fetchRequest = orderFetchRequest()
        fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedContext, sectionNameKeyPath:nil, cacheName: nil)

                do {
                    try fetchedResultsController.performFetch()

                    singleGroupTableView.reloadData()
                }
                catch let error as NSError {
                    print("Could not fetch \(error), \(error.userInfo)")
                }
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return fetchedResultsController.fetchedObjects?.count ?? 0
...