2014-12-17 11 views
12

Sono nuovo di CoreData, ho letto alcuni tutorial ma sono uscito a mani vuote. La maggior parte dei tutorial sono incentrati sul recupero da CoreData per popolare una vista tabella, che non è quello che sto facendo al momento.Recupero dell'elemento più recente da CoreData in Swift

Ecco come imposto i dati in CoreData. Tutti i tipi sono Double ad eccezione di data che è un 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) 
} 

Ecco quello che sto cercando di fare per ottenere i risultati, ma non sono in grado di accedere le cose come .minutes, .date, ecc so anche non sto ottenendo correttamente l'ultimo elemento, stavo solo cercando di stampare prima gli attributi sull'oggetto.

mi piacerebbe aiuto su come recuperare solo l'oggetto più recente come pure mostrare che è la attributi

Grazie!

risposta

16

Innanzitutto, creare un file "Meditation.swift" in Xcode con "Editor -> Crea sottoclasse NSManagedObject ...". Il file generato dovrebbe essere simile

import Foundation 
import CoreData 

class Meditation: NSManagedObject { 

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

} 

Ora è possibile utilizzare le proprietà direttamente invece di valore-chiave di codifica e creare l'oggetto come

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

Quando andare a prendere l'oggetto, il cast del risultato di executeFetchRequest() a [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)") 
} 

Infine, per andare a prendere solo l'ultimo oggetto, aggiungere una sorta d escriptor per ordina i risultati per data in ordine decrescente, e limitare il numero di risultati da uno:

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

La matrice objects contiene al massimo un oggetto, che è quella più recente.

+0

Martin, questa è una risposta fantastica. Grazie. Mi mancava la sottoclasse che è davvero utile. Una cosa: sto ricevendo un errore sulla riga 'managedObjectContext.save (& error)' relativo al puntatore di errore '& error' –

+0

@ZackShapiro: Avrai bisogno di' var error: NSError? 'Come nella richiesta di recupero , L'ho aggiunto al codice. –

+0

Grazie per l'aggiornamento. Dopo aver eseguito tutto questo, ottengo che stampi i valori '.length' e' .date', poi raggiunge un punto di interruzione e mi dice 'CoreData: warning: Impossibile caricare la classe denominata 'Meditation' per l'entità 'Meditation' . Classe non trovata, utilizzando invece NSManagedObject predefinito. –

Problemi correlati