从Swift中的CoreData获取最近的项目 [英] Fetching the most recent item from CoreData in Swift

查看:97
本文介绍了从Swift中的CoreData获取最近的项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是CoreData的新手,已经阅读了几个教程,但是空手而归。大多数教程都集中在从CoreData获取填充tableview,这不是我现在正在做的。



这里是如何设置CoreData中的数据。除了 NSDate

$ d

<$ c $

  let appDelegate =(UIApplication.sharedApplication()。delegate as AppDelegate)

让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)

//从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 等等。我知道我也没有正确得到最后一个项目,我只是试图打印出对象的属性首先。



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



谢谢!

解决方案

首先,在Xcode中创建一个Meditation.swift > 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错误:NSError?
if!managedObjectContext.save(& error){
println(save failed:\(error?.localizedDescription))
}

获取对象时,将
executeFetchRequest()的结果转换为 [Meditation]

  let request = NSFetchRequest(entityName: )

var error:NSError?
let result = managedObjectContext.executeFetchRequest(request,error:& error)
如果let objects = result as? [冥想] {
对于冥想的对象{
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 数组最多包含一个对象,这是最近的一个。


I'm new to CoreData, have read a few tutorials but have come up empty-handed. Most tutorials have centered around fetching from CoreData to populate a tableview, which is not what I'm doing at the moment.

Here's how I'm setting the data in CoreData. All types are Double except for date which is an 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)
}

Here's what I'm trying to do to get the results, but I'm not able to access things like .minutes, .date, etc. I know I'm also not properly getting the last item either, I was just trying to print out attributes on the object first.

I'd love help on how to fetch only the most recent object as well as show it's attributes

Thanks!

解决方案

First, create a "Meditation.swift" file in Xcode with "Editor -> Create NSManagedObject Subclass ...". The generated file should look like

import Foundation
import CoreData

class Meditation: NSManagedObject {

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

}

Now you can use the properties directly instead of Key-Value Coding and create the object as

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)")
}

When fetching the object, cast the result of executeFetchRequest() to [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)")
}

Finally, to fetch only the latest object, add a sort descriptor to sort the results by date in descending order, and limit the number of results to one:

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

Then the objects array contains at most one object, which is the most recent one.

这篇关于从Swift中的CoreData获取最近的项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆