2014-12-17 11 views
12

CoreData'ya yeni oldum, birkaç eğitici okumuştum ama boş bir el yazdım. Çoğu öğretici, bir masa görüşünü doldurmak için CoreData'dan getirme konusunda ortalanmış durumda.En son çıkan öğeyi SwiftData'dan SwiftData ile getirme

Verileri CoreData'da nasıl ayarlıyorum. Her türlü tarih hariç Double hangi İşte bir 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) 
} 

Ben sonuç almak için yapmaya çalışıyorum ne, ama biliyorsun ben vb .date, .minutes gibi şeyler erişmek mümkün değilim Ayrıca son öğeyi de doğru şekilde almıyorum, sadece ilk önce nesnenin niteliklerini yazdırmaya çalışıyordum.

Ben yalnızca en son nesne getirme konusunda yardım rica yanı sıra bu kadar gösterirdim

Teşekkür bağlıyor!

cevap

16

Önce, "Editor -> Create NSManagedObject Alt Sınıf ..." ile Xcode'ta bir "Meditation.swift" dosyası oluşturun.

import Foundation 
import CoreData 

class Meditation: NSManagedObject { 

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

} 

Şimdi Kodlama Anahtarı-Değerinin yerine doğrudan özelliklerini kullanmak ve nesneyi getirilirken zaman

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

olarak nesneyi oluşturabilirsiniz gibi oluşturulan dosya görünmelidir, executeFetchRequest() sonucunu döküm [Meditation] için: Nihayet

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

, sadece en son nesneyi almak için, bir nevi d eklemek azalan sırada tür Sonuçları tarihe göre escriptor ve birine sonuç sayısını sınırlamak:

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

Sonra objects dizisi En son biridir en çok bir nesne içerir.

+0

Martin, bu harika bir cevap. Teşekkür ederim. Gerçekten yardımcı olan alt sınıfı kaçırıyordum. Tek şey: 'errorObjectContext.save (& error)' 'hata ve hata 'hata işaretçisi –

+0

@ ZackShapiro ile ilgili satırda bir hata alıyorum:" var hata: NSError? " Kodu ekledim. –

+0

Güncelleme için teşekkürler. Tüm bunları çalıştırdıktan sonra '.length' ve' .date' değerlerini yazdıracağım, sonra bir kesme noktasına ulaşıyor ve bana CoreData diyor: uyarı: 'Meditasyon' için 'Meditasyon' adlı sınıf yüklenemedi. . Sınıf bulunamadı, varsayılan NSManagedObject yerine ' –

İlgili konular