2014-12-17 16 views
12

Jestem nowy w CoreData, przeczytałem kilka tutoriali, ale przyszedłem z pustymi rękami. Większość samouczków koncentruje się na pobieraniu danych z CoreData w celu zapełnienia widoku tabeli, co nie jest obecnie tym, co robię.Pobieranie najnowszego elementu z CoreData w Swift

Oto jak ustawiam dane w CoreData. Wszystkie typy są Double z wyjątkiem daty, która jest 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) 
} 

Oto, co usiłuję zrobić, aby uzyskać wyniki, ale nie jestem w stanie uzyskać dostęp do rzeczy, jak .minutes, .date itp wiem również nie otrzymuję poprawnie ostatniego elementu, próbowałem najpierw wydrukować atrybuty obiektu.

chęcią pomocy, w jaki sposób pobrać tylko najnowsze obiektu, a także pokazać, że to atrybuty

Dzięki!

Odpowiedz

16

Najpierw utwórz plik "Meditation.swift" w Xcode za pomocą "Editor -> Create NSManagedObject Subclass ...". Wygenerowany plik powinien wyglądać

import Foundation 
import CoreData 

class Meditation: NSManagedObject { 

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

} 

Teraz można użyć właściwości bezpośrednio zamiast klucz-wartość Coding i utworzyć obiekt jako

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)") 
} 

Kiedy ściągam obiekt, oddanych wynik executeFetchRequest() do [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)") 
} 

Wreszcie, aby pobrać tylko najnowsze obiektu, dodać sortowania d escriptor do sortowania wyników według daty w kolejności malejącej, a ograniczyć liczbę wyników do jednego:

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

Następnie tablica objects zawiera co najwyżej jeden obiekt, który jest najnowszym jeden.

+0

Martin, to jest niesamowita odpowiedź. Dziękuję Ci. Brakowało mi podklasy, która jest naprawdę pomocna. Jedna rzecz: Dostaję błąd na linii 'managedObjectContext.save (& error)' związany ze wskaźnikiem błędu '& error' –

+0

@ZackShapiro: Będziesz potrzebował' var error: NSError? 'Jak w żądaniu pobierania , Dodałem go do kodu. –

+0

Dzięki za aktualizację. Po uruchomieniu tego wszystkiego, dostaję go, aby wydrukować wartości '.length' i' .date', a następnie uderza w punkt przerwania i informuje mnie 'CoreData: ostrzeżenie: Nie można załadować klasy o nazwie" Medytacja "dla jednostki" Medytacja " . Nie znaleziono klasy, używając domyślnego NSManagedObject. " –

Powiązane problemy