WedX - журнал о программировании и компьютерных науках

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

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

Спасибо!

17.12.2014

Ответы:


1

Сначала создайте файл «Meditation.swift» в Xcode с помощью «Editor -> Create 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 содержит не более одного объекта, который является самым последним.

17.12.2014
  • Мартин, это потрясающий ответ. Спасибо. Мне не хватало подкласса, который действительно полезен. Одна вещь: я получаю сообщение об ошибке в строке managedObjectContext.save(&error), связанной с указателем ошибки &error 17.12.2014
  • @ZackShapiro: вам понадобится var error : NSError?, как в запросе на выборку, я добавил его в код. 17.12.2014
  • Спасибо за обновления. После запуска всего этого я заставляю его распечатать значения .length и .date, затем он попадает в точку останова и сообщает мне CoreData: warning: Unable to load class named 'Meditation' for entity 'Meditation'. Class not found, using default NSManagedObject instead. 17.12.2014
  • Происходит из линии insertNewObjectForEntityForName 17.12.2014
  • @ZackShapiro: это хорошо известная проблема, см. (например) stackoverflow.com/questions/25076276/. (Ответ Кристера, пожалуй, самое простое решение.) 17.12.2014
  • Ах. Понятно. Я исправил это, поместив @objc(Meditation) над объявлением класса в Meditation.swift. Еще раз спасибо за помощь. Это феноменальный ответ. 17.12.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]