Использование NSPredicate и NSSortDescriptor с NSSet в основных данных

Подобный вопрос задавался ранее на SO. Я изучил каждый из них, но не смог найти полезный ответ, применимый к моему делу, так что вот. Мой вопрос состоит из двух частей. Но сначала позвольте мне объяснить основы.

У меня есть подкласс NSManagedObject под названием Activity.

import Foundation
import CoreData

class Activity: NSManagedObject {

    @NSManaged var endTime: NSDate
    @NSManaged var id: NSNumber
    @NSManaged var startTime: NSDate
    @NSManaged var status: NSNumber
    @NSManaged var actions: NSSet
    @NSManaged var checkInAndOuts: NSSet

}

Этот класс имеет два отношения ко многим (действия, checkInAndOuts) с двумя другими классами. Ниже приведены эти классы.

Действие

import Foundation
import CoreData

class Action: NSManagedObject {

    @NSManaged var desc: String
    @NSManaged var id: NSNumber
    @NSManaged var status: NSNumber
    @NSManaged var name: String
    @NSManaged var activity: Activity

}

Вход и выход

import Foundation
import CoreData

class CheckInAndOut: NSManagedObject {

    @NSManaged var checkInDate: NSDate
    @NSManaged var checkInUserId: NSNumber
    @NSManaged var checkOutDate: NSDate
    @NSManaged var checkOutUserId: NSNumber
    @NSManaged var id: NSNumber
    @NSManaged var activity: Activity

}

Одно действие может иметь несколько действий и CheckInAndOuts. В методе viewDidLoad в VC я получаю массив действий.

Теперь о проблемах, с которыми я сталкиваюсь.

Использование NSPredicate

В Action есть свойство status. Он может иметь только три значения; 1, 2, -1. Я хочу отфильтровать действия без статуса -1. Когда я попытался запустить следующий предикат для свойства actions класса Activity, как описано здесь , я получил ошибку EXC_BAD_ACCESS.

let actionsPredicate = NSPredicate(format: "ANY actions.status != %@", -1)

Как я могу получить объекты Activity, у которых есть действия только со статусом 1 и 2?

Использование NSSortDescriptor

Другая проблема, с которой я столкнулся, — это попытка отсортировать свойство checkInAndOuts. Это свойство содержит набор объектов CheckInAndOut. Я хочу, чтобы эти объекты были отсортированы в порядке возрастания по его свойству checkInDate. Когда я запустил следующую строку кода,

let CIAODescriptor = NSSortDescriptor(key: "checkInAndOuts.checkInDate", ascending: true)

Сбой проекта из-за ошибки Ключ to-many здесь не разрешен.

Может ли кто-нибудь иметь опыт работы с основными данными, пожалуйста, протяните мне руку помощи? Я был бы очень признателен.

Спасибо.


person Isuru    schedule 28.09.2014    source источник
comment
любое решение по этому поводу?   -  person foolbear    schedule 19.02.2021
comment
@foolbear Это очень старый вопрос. Я не думаю, что нашел решение. Если я это сделал, я обычно публикую ответ сам. Прости.   -  person Isuru    schedule 19.02.2021


Ответы (1)


Что касается статуса NSPredicate, это NSNumber, а в Predicate вы передаете строку, которая приводит к базовому доступу, используя приведенный ниже код.

let actionsPredicate = NSPredicate(format: "ANY actions.status != %@", [NSNumber numberWithInt:-1])

Проблема NSSortDescriptor использует приведенный ниже код

let CIAODescriptor = NSSortDescriptor(key: "checkInDate", ascending: true)
person Rocker    schedule 28.09.2014