2015-05-04 2 views
0

Я пытаюсь получить управляемые объекты из Core Data по их URI. Для этого я нашел пример Objective-C метода (http://www.cocoawithlove.com/2008/08/safely-fetching-nsmanagedobject-by-uri.html) и превратил его в Swift ...Основные данные - Получить управляемый объект по URI

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; 
} 

Однако метод всегда возвращает ноль, т.е. запрос выборки возвращается с пустыми руками, и я не знаю, почему. До NSFetchRequest все выглядит корректно. Кто-нибудь имеет представление, что может быть неправильным?

ответ

0

Решил проблему. Это было связано с другой, более глубокой проблемой в моем основном коде данных, описанном здесь: Mac OSX - Core data isn't stored

Вышеуказанный метод работает отлично.

1

Убедитесь, что объект и предикат содержат ожидаемые значения.

Еще одно предложение написать свой предикат NSPredicate(format:) для большей ясности.

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

Я изменил ваши имена переменных для удобства чтения.

+1

NSFetchRequest является ссылочным типом, поэтому «let» vs «var» не имеет никакого значения (и «let» является предпочтительным, если только вам не потребуется назначать другой запрос переменной req. –

+0

Спасибо, что указали это. – Mundi

+0

Нет, еще не повезло. Также после того, как вы попробовали его с предикатной строкой. Я добавил отладочную информацию о предикате и сущности выше, если в них есть что-то подозрительное. Мне не хватает опыта с Core Data, я тоже вижу что-то в этом, что может быть неправильным. – BadmintonCat

Смежные вопросы