2014-09-28 119 views
0

在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) 

项目开车撞到许多不在这里允许关键错误

任何有经验的核心数据请给我一个帮助吗?我真的很感激它。

谢谢。

回答

0

关于NSPredicate状态是NSNumber,并且在Predicate中传递的字符串会导致基本访问使用下面的代码。

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

NSSortDescriptor问题使用下面的代码

let CIAODescriptor = NSSortDescriptor(key: "checkInDate", ascending: true) 
相关问题