Подтвердить что ты не робот

Получение последнего элемента из CoreData в Swift

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

Вот как я устанавливаю данные в 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 и т.д. Я знаю, что я тоже неправильно получаю последний элемент, Я просто пытался сначала распечатать атрибуты объекта.

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

Спасибо!

4b9b3361

Ответ 1

Сначала создайте файл "Meditation.swift" в Xcode с помощью "Редактор → Создать NSManagedObject Subclass... ". Сгенерированный файл должен выглядеть как

import Foundation
import CoreData

class Meditation: NSManagedObject {

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

}

Теперь вы можете использовать свойства непосредственно вместо кодирования по значению ключа и создайте объект как

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

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

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

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