2014-12-17 3 views
12

Я новичок в CoreData, прочитал несколько руководств, но пришел с пустыми руками. Большинство учебных пособий сосредоточились на извлечении из CoreData, чтобы заполнить табличное представление, и это не то, что я делаю в данный момент.Получение последнего элемента из CoreData в Swift

Вот как я устанавливаю данные в CoreData. Все типы Double за исключением даты, которая является NSDate

let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 

let managedObjectContext = appDelegate.managedObjectContext 
let entityDescription = NSEntityDescription.entityForName("Meditation", inManagedObjectContext: managedObjectContext!) 
let meditation = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext!) 

meditation.setValue(settings.minutes, forKey: "length") 
meditation.setValue(settings.warmup, forKey: "warmup") 
meditation.setValue(settings.cooldown, forKey: "cooldown") 
meditation.setValue(NSDate(), forKey: "date") 

// fetch stuff from CoreData 
var request = NSFetchRequest(entityName: "Meditation") 
var error:NSError? = nil 
var results:NSArray = managedObjectContext!.executeFetchRequest(request, error: &error)! 

for res in results { 
    println(res) 
} 

Вот что я пытаюсь сделать, чтобы получить результаты, но я не в состоянии получить доступ к вещам, как .minutes, .date и т.д. Я знаю, что я 'm также не получил должным образом последний элемент, я просто пытался сначала распечатать атрибуты объекта.

Я хотел бы помочь, как извлечь только самый последний объект, а также показать, что это атрибуты

Спасибо!

ответ

16

Сначала создайте файл «Meditation.swift» в Xcode с помощью «Редактор -> Создать NSManagedObject Подкласс ...». Созданный файл должен выглядеть

import Foundation 
import CoreData 

class Meditation: NSManagedObject { 

    @NSManaged var length: NSNumber 
    @NSManaged var warmup: NSNumber 
    @NSManaged var cooldown: NSNumber 
    @NSManaged var date: NSDate 

} 

Теперь вы можете использовать свойства непосредственно вместо Key-Value Coding и создать объект как

let meditation = NSEntityDescription.insertNewObjectForEntityForName("Meditation", inManagedObjectContext: managedObjectContext) as Meditation 
meditation.length = ... 
meditation.warmup = ... 
meditation.cooldown = ... 
meditation.date = NSDate() 

var error : NSError? 
if !managedObjectContext.save(&error) { 
    println("save failed: \(error?.localizedDescription)") 
} 

При получении объекта, отлитый результат executeFetchRequest() в [Meditation]:

let request = NSFetchRequest(entityName: "Meditation") 

var error : NSError? 
let result = managedObjectContext.executeFetchRequest(request, error: &error) 
if let objects = result as? [Meditation] { 
    for meditation in objects { 
     println(meditation.length) 
     println(meditation.date) 
     // ... 
    } 
} else { 
    println("fetch failed: \(error?.localizedDescription)") 
} 

Наконец, для извлечения только последний объект, добавить сортировку д escriptor к сортировать результаты по дате в порядке убывания, а также ограничить количество результатов к одному:

let request = NSFetchRequest(entityName: "Meditation") 
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)] 
request.fetchLimit = 1 
// ... 

objects Затем массив содержит более одного объекта, который является самым последним один.

+0

Мартин, это замечательный ответ. Спасибо. Мне не хватало подкласса, который действительно полезен. Одна вещь: я получаю сообщение об ошибке 'managedObjectContext.save (& error)' связанный с указателем ошибки '& error' –

+0

@ZackShapiro: вам понадобится' var error: NSError? ', Как в запросе выборки , Я добавил его в код. –

+0

Спасибо за обновление. После запуска всего этого, я получаю его для печати значений .length и '.date', затем он попадает в точку останова и сообщает мне:« CoreData: warning: Невозможно загрузить класс с именем «Медитация» для объекта «Медитация», , Класс не найден, используя вместо этого по умолчанию NSManagedObject. ' –