从Swift中的Core Data获取最新项目

时间:2014-12-17 19:55:56

标签: 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)
}

以下是我尝试取得的结果,但我无法访问.minutes.date等内容。我知道我也没有正确地获取最后一项,我只是试图首先在对象上打印出属性。

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

谢谢!

1 个答案:

答案 0 :(得分:18)

首先,创建一个" Meditation.swift"在Xcode中使用"编辑器 - >创建NSManagedObject 子类......"。生成的文件应该类似于

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