1

У меня есть объект с данными ядра с несколькими атрибутами, и мне нужен список всех объектов в одном атрибуте. Мой код выглядит следующим образом:Получение выбранного атрибута в объектах

 let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
     let context:NSManagedObjectContext = appDel.managedObjectContext! 

     let sortDesc = NSSortDescriptor(key: "username", ascending: true) 

     let fetchReq = NSFetchRequest(entityName: "Identities") 
     fetchReq.sortDescriptors = [sortDesc] 
     fetchReq.valueForKey("username") 

     let en = NSEntityDescription.entityForName("Identities", inManagedObjectContext: context) 

     userList = context.executeFetchRequest(fetchReq, error: nil) as [Usernames] 

Но это дает мне NSException-ошибку, и я не могу понять, почему и как я должен это сделать. Я прочитал описание класса NSFetchRequest, но не мог понять его.

Любые предложения будут оценены.

EDIT: После наводки Bluehound я изменил код так:

var userList = [Model]() 
@IBAction func printUsers(sender: AnyObject) { 
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 

    let sortDesc = NSSortDescriptor(key: "friendID", ascending: true) 

    let fetchReq = NSFetchRequest(entityName: "Identities") 
    fetchReq.sortDescriptors = [sortDesc] 
    fetchReq.propertiesToFetch = ["friendID"] 

    let en = NSEntityDescription.entityForName("Identities", inManagedObjectContext: context) 

    userList = context.executeFetchRequest(fetchReq, error: nil) as [Model] 

    println(userList) 

} 

Ошибка выполнения ушла, но я до сих пор не знаю, если это работает, потому что я не знаю, как конвертировать список в список строк.

Как всегда, предложения будут оценены.

+0

Использовать свойство 'свойстваToFetch'' NSFetchRequest' вместо 'valueForKey' – Ian

+0

@Bluehound Можете ли вы показать мне, что у меня возникли проблемы с инициализацией NSPropertyDescription. – martin

+0

Как выглядит вывод println (userList)? – pbasdf

ответ

3

Есть два варианта: Вы можете оформить нормальный принести запрос и извлечь массив, содержащий разыскиваемый атрибут из результата, с помощью map():

let fetchReq = NSFetchRequest(entityName: "Identities") 
fetchReq.sortDescriptors = [sortDesc] 

var error : NSError? 
if let result = context.executeFetchRequest(fetchReq, error: &error) as? [Model] { 
    let friendIDs = map(result) { $0.friendID } 
    println(friendIDs) 
} else { 
    println("fetch failed: \(error!.localizedDescription)") 
} 

Swift 2:

let fetchReq = NSFetchRequest(entityName: "Identities") 
fetchReq.sortDescriptors = [sortDesc] 

do { 
    let result = try context.executeFetchRequest(fetchReq) as! [Model] 
    let friendIDs = result.map { $0.friendID } 
    print(friendIDs) 
} catch let error as NSError { 
    print("fetch failed: \(error.localizedDescription)") 
} 

Или вы установили resultType на .DictionaryResultType и propertiesToFetch на искомый атрибут. В этом случае запрос выборки возвращает массив словарей:

let fetchReq = NSFetchRequest(entityName: "Identities") 
fetchReq.sortDescriptors = [sortDesc] 
fetchReq.propertiesToFetch = ["friendID"] 
fetchReq.resultType = .DictionaryResultType 

var error : NSError? 
if let result = context.executeFetchRequest(fetchReq, error: &error) as? [NSDictionary] { 
    let friendIDs = map(result) { $0["friendID"] as String } 
    println(friendIDs) 
} else { 
    println("fetch failed: \(error!.localizedDescription)") 
} 

Swift 2:

let fetchReq = NSFetchRequest(entityName: "Identities") 
fetchReq.sortDescriptors = [sortDesc] 
fetchReq.propertiesToFetch = ["friendID"] 
fetchReq.resultType = .DictionaryResultType 

do { 
    let result = try context.executeFetchRequest(fetchReq) as! [NSDictionary] 
    let friendIDs = result.map { $0["friendID"] as! String } 
    print(friendIDs) 
} catch let error as NSError { 
    print("fetch failed: \(error.localizedDescription)") 
} 

Второй метод имеет то преимущество, что только указанные свойства извлекается из базы данных , а не все управляемые объекты.

Это имеет тот недостаток, что результат не включает в ожидании несохраненных изменений в контексте управляемого объекта (includesPendingChanges: неявно устанавливаются в false при использовании .DictionaryResultType).

+0

Я взял имя объекта «Идентичность» и имя подкласса управляемого объекта «Модель» из кода вашего вопроса. Обычно для обоих можно использовать одно и то же имя. –

+0

Еще раз спасибо Мартину, вы никогда не разочаровываетесь :) Да, я знаю, что имена не оптимальны, это всего лишь «тестовый проект», который я создал давно. – martin