在核心数据中使用带有NSSet的NSPredicate和NSSortDescriptor
问题描述:
在SO上也有类似的问题。我研究了其中的每一个,但无法找到适用于我的案例的有用答案,所以在这里。我的问题有两个部分。但首先让我解释基础知识。在核心数据中使用带有NSSet的NSPredicate和NSSortDescriptor
我有一个NSManagedObject
子类叫做活动。
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
}
该类与两个其他类具有两个多对多关系(actions,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
}
CheckInAndOut
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。在VC中的viewDidLoad
方法中,我正在检索一组活动。
现在谈谈我面临的问题。
使用NSPredicate
在行动,有一个叫status
属性。它只能有三个值; 1,2,-1。我想过滤掉没有状态-1的动作。当我试图运行属性Activity类(如here所述)时,我得到了一个EXC_BAD_ACCESS错误。
let actionsPredicate = NSPredicate(format: "ANY actions.status != %@", -1)
如何检索只有状态为1和2的动作的Activity对象?
使用NSSortDescriptor
我现在面临的另一个问题是试图在checkInAndOuts
属性进行排序。此属性有一组CheckInAndOut对象。我希望这些对象按其属性checkInDate
以升序排序。当我跑到下面的代码行,
let CIAODescriptor = NSSortDescriptor(key: "checkInAndOuts.checkInDate", ascending: true)
项目开车撞到许多不在这里允许关键错误。
任何有经验的核心数据请给我一个帮助吗?我真的很感激它。
谢谢。
答
关于NSPredicate状态是NSNumber,并且在Predicate中传递的字符串会导致基本访问使用下面的代码。
let actionsPredicate = NSPredicate(format: "ANY actions.status != %@", [NSNumber numberWithInt:-1])
NSSortDescriptor问题使用下面的代码
let CIAODescriptor = NSSortDescriptor(key: "checkInDate", ascending: true)