核心数据 - 通过URI获取托管对象

时间:2015-05-04 11:09:54

标签: objective-c cocoa swift cocoa-touch core-data

我正在尝试通过URI从Core Data中获取托管对象。为此我找到了一个方法(http://www.cocoawithlove.com/2008/08/safely-fetching-nsmanagedobject-by-uri.html)的Objective-C示例并将其转换为Swift ...

func getManagedObjectWithURI(uri:NSURL) -> NSManagedObject?
{
    if let psc = persistentStoreCoordinator
    {
        let objID = psc.managedObjectIDForURIRepresentation(uri);
        if (objID != nil)
        {
            let obj:NSManagedObject = managedObjectContext!.objectWithID(objID!);

            if (!obj.fault)
            {
                return obj;
            }

            let prd = NSComparisonPredicate(leftExpression: .expressionForEvaluatedObject(), rightExpression: NSExpression(forConstantValue: obj), modifier: .DirectPredicateModifier, type: .EqualToPredicateOperatorType, options: .allZeros);

            let req = NSFetchRequest();
            req.entity = objID?.entity;
            req.predicate = prd;

            var results:[NSManagedObject] = managedObjectContext!.executeFetchRequest(req, error: nil) as! [NSManagedObject];

            if (!results.isEmpty)
            {
                return results.first;
            }
        }
    }

    return nil;
}

然而,该方法总是返回nil,即获取请求空手返回,我不知道为什么。直到NSFetchRequest一切看起来都有效。有没有人知道可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

检查实体和谓词是否包含预期值。

另一个建议是,为了清晰起见,用NSPredicate(format:)编写谓词。

request.predicate = NSPredicate(format: "self = %@", object)

为了便于阅读,我更改了变量名称。

答案 1 :(得分:0)

解决了这个问题。它实际上与我在此解释的核心数据代码中的另一个更深层次的问题有关:Mac OSX - Core data isn't stored

上述方法可以正常工作。