【问题标题】:Fetching the most recent item from CoreData in Swift在 Swift 中从 CoreData 中获取最新的项目
【发布时间】:2015-02-16 11:36:44
【问题描述】:

我是 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 等内容。我知道我也没有正确获得最后一项,我只是想先打印出对象的属性。

我很想帮助我了解如何仅获取最近的对象以及显示它的属性

谢谢!

【问题讨论】:

    标签: core-data swift


    【解决方案1】:

    首先,在 Xcode 中使用“Editor -> Create NSManagedObject”创建一个“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
    
    }
    

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

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

    【讨论】:

    • 马丁,这是一个很棒的答案。谢谢你。我错过了真正有用的子类。一件事:我在与&error 错误指针相关的managedObjectContext.save(&error) 行上遇到错误
    • @ZackShapiro:你需要var error : NSError?,就像在获取请求中一样,我已将其添加到代码中。
    • 感谢您的更新。运行所有这些之后,我让它打印出 .length.date 值,然后它遇到断点并告诉我 CoreData: warning: Unable to load class named 'Meditation' for entity 'Meditation'. Class not found, using default NSManagedObject instead.
    • 源自insertNewObjectForEntityForName
    • @ZackShapiro:这是一个众所周知的问题,请参阅(例如)stackoverflow.com/questions/25076276/…。 (Christer 的回答可能是最简单的解决方案。)
    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多