Core Data - 通过 URI 获取托管对象

Posted

技术标签:

【中文标题】Core Data - 通过 URI 获取托管对象【英文标题】:Core Data - Get managed object by URI 【发布时间】:2015-05-04 11:09:54 【问题描述】:

我正在尝试通过它们的 URI 从 Core Data 获取托管对象。为此,我找到了一个 Objective-C 方法示例 (http://www.cocoawithlove.com/2008/08/safely-fetching-nsmanagedobject-by-uri.html) 并将其转换为 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,即 fetch 请求空手返回,我不知道为什么。直到 NSFetchRequest 一切看起来都有效。有谁知道可能出了什么问题?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

NSFetchRequest 是一个引用类型,因此“let”与“var”没有任何区别(并且“let”是首选,除非您稍后需要将另一个请求分配给req 变量)。 不,仍然没有运气。同样在尝试使用谓词字符串格式之后。我添加了上面谓词和实体的调试输出,以防这些中有任何可疑之处。我缺乏使用 Core Data 的经验,也发现其中有任何错误。 我怀疑我的核心数据实现有问题。它告诉我在尝试保存时它没有任何变化,即使它应该(填充了设置为使用 CoreData 的 NSArrayControllers)。这可能与上述问题有关。【参考方案2】:

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

上述方法可以正常工作。

【讨论】:

以上是关于Core Data - 通过 URI 获取托管对象的主要内容,如果未能解决你的问题,请参考以下文章

防止托管对象被 Core Data 再次出错

有没有比获取请求更快的方法来检索 Core Data 中的特定托管对象?

Core Data - 批量处理获取结果的属性

在 Core Data 中更改托管对象模型的属性值时崩溃

Core Data,我如何有效地查找和删除托管对象

在 Core Data 中执行子获取时,在父上下文中修改托管对象是不是会向下传播到子上下文?