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

Core data 从Swift中的CoreData获取最新项目,core-data,swift,Core Data,Swift,我是CoreData的新手,读过一些教程,但都是空手而归。大多数教程都以从CoreData获取数据来填充tableview为中心,这不是我目前正在做的 下面是我在CoreData中设置数据的方法。所有类型均为Double,日期除外,日期为NSDate let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) let managedObjectContext = appDelegate.manage

我是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)
}
下面是我试图获取结果的步骤,但我无法访问
.minutes
.date
等内容。我知道我也没有正确获取最后一项,我只是尝试先打印对象的属性

我希望获得有关如何仅获取最新对象以及显示其属性的帮助

谢谢

首先,使用“编辑器->创建NSManagedObject”在Xcode中创建一个“冥想.swift”文件 子类。生成的文件应该如下所示

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()
[冥想]

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
数组最多包含一个对象,这是最近的一个对象。

Martin,这是一个很棒的答案。非常感谢。我错过了真正有用的子类。有一件事:我在与
&error
错误相关的
managedObjectContext.save(&error)
行上收到一个错误pointer@ZackShapiro:您需要
var error:NSError?
正如在获取请求中一样,我已将其添加到代码中。感谢更新。运行所有这些之后,我让它打印出
.length
.date
值,然后它点击一个断点并告诉我
CoreData:警告:无法为实体“冥想”加载名为“冥想”的类。找不到类,而是使用默认的NSManagedObject。
源于insertNewObjectForEntityForNameline@ZackShapiro:这是一个众所周知的问题,请参见(例如)。(克里斯特的答案也许是最简单的解决方案。)