从Swift中获取CoreData中最新的项目

Zac*_*iro 13 core-data swift

我是CoreData的新手,已经阅读了一些教程,但空手而归.大多数教程都集中在从CoreData获取以填充tableview,这不是我目前所做的.

这是我在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)
}
Run Code Online (Sandbox Code Playgroud)

这里就是我想要做的就是结果,但我不能访问类的东西.minutes,.date等我知道我还不能正确得到最后一个项目或者,我只是想在打印出的属性首先是对象.

我非常喜欢如何获取最新的对象以及显示它的属性

谢谢!

Mar*_*n R 20

首先,使用"Editor - > Create NSManagedObject Subclass ..."在Xcode中创建一个"Meditation.swift"文件.生成的文件应该是这样的

import Foundation
import CoreData

class Meditation: NSManagedObject {

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

}
Run Code Online (Sandbox Code Playgroud)

现在,您可以直接使用属性而不是键值编码,并将对象创建为

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)")
}
Run Code Online (Sandbox Code Playgroud)

获取对象时,将结果转换 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)")
}
Run Code Online (Sandbox Code Playgroud)

最后,要仅获取最新对象,请添加排序描述符以按日期降序对结果进行排序,并将结果数限制为一:

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

然后该objects数组最多包含一个对象,这是最新的对象.