2014-12-17 8 views
12

Ich bin neu in CoreData, habe ein paar Tutorials gelesen, aber sind leer ausgegangen. Die meisten Tutorials haben sich darauf konzentriert, aus CoreData eine Tabellenansicht zu füllen, was ich gerade nicht mache.Abrufen des neuesten Elements aus CoreData in Swift

So stelle ich die Daten in CoreData ein. Alle Typen sind Double mit Ausnahme von Datum, das ein 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) 
} 

Hier ist, was ich versuche, um die Ergebnisse zu erhalten, zu tun, aber ich bin nicht in der Lage, Dinge zu greifen wie .minutes, .date, etc. Ich weiß, dass ich Ich bekomme auch nicht das letzte Objekt, ich habe nur versucht, zuerst Attribute auf dem Objekt auszudrucken.

ich Hilfe lieben würde, wie nur als auch das neueste Objekt zu holen, wie zeige es Attribute

Dank!

Antwort

16

Erstellen Sie zuerst eine "Meditation.swift" Datei in Xcode mit "Editor -> Create NSManagedObject Subclass ...". Die erzeugte Datei aussehen sollte

import Foundation 
import CoreData 

class Meditation: NSManagedObject { 

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

} 

Jetzt können Sie die Eigenschaften direkt anstelle von Key-Wert verwenden Codierung und das Objekt als

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

erstellen Wenn das Objekt zu holen, warf das Ergebnis executeFetchRequest() zu [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)") 
} 

, schließlich nur das neueste Objekt, fügen Sie eine Art d zu holen Escriptor zu Resultate sortieren nach Datum in absteigender Reihenfolge, und begrenzen die Anzahl der Ergebnisse zu einem:

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

Dann wird die objects Array enthält höchstens ein Objekt, das die jüngste ist.

+0

Martin, das ist eine tolle Antwort. Vielen Dank. Ich habe die Unterklasse vermisst, die wirklich hilfreich ist. Eine Sache: Ich bekomme einen Fehler in der Zeile 'ManagedObjectContext.save (& Fehler)' bezogen auf die '& Error' Fehlerzeiger –

+0

@ZackShapiro: Sie benötigen' Var Fehler: NSError? 'Wie in der Abrufanforderung Ich habe es dem Code hinzugefügt. –

+0

Danke für das Update. Nachdem ich all dies ausgeführt habe, bekomme ich die Werte '.length' und' .date' auszudrucken, dann trifft es einen Haltepunkt und sagt mir 'CoreData: warning: Kann die Klasse 'Meditation' für die Entität 'Meditation' nicht laden . Die Klasse wurde nicht gefunden und verwendet stattdessen das Standard-NSManagedObject.' –

Verwandte Themen