2014-12-17 5 views
12

저는 CoreData를 처음 접했고 자습서 몇 개를 읽었지만 공손한 것으로 나타났습니다. 대부분의 자습서는 CoreData에서 가져 오기를 중심으로 테이블 뷰를 채 웁니다.Swift의 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) 
} 

내가 결과를 얻을 수 있도록 할 노력하고있어 무엇이다,하지만 난 내가 아는 등, .date, .minutes 같은 것들을 액세스 할 수 없습니다 해요 또한 마지막 항목도 적절하게 가져 오지 못했습니다. 객체에 대한 속성을 먼저 인쇄하려고했습니다.

내가 가장 최근의 객체를 가져 오는 방법에 대한 도움말을 사랑뿐만 아니라 그것의 표시 줄은

감사 속성!

답변

16

먼저 Xcode에서 "Editor -> Create NSManagedObject Subclass ..."를 사용하여 "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)") 
} 

, 최신 개체를 가져 오기 위해, 정렬 D를 추가 내림차순으로 종류에 날짜별로 결과를 escriptor, 하나에 결과의 수를 제한 :

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

그런 다음 objects 배열은 가장 최근 대부분에서 하나의 객체를 포함합니다.

+0

마틴, 이것은 대단한 답변입니다. 고맙습니다. 나는 정말로 도움이되는 서브 클래스를 놓치고 있었다. 한 가지 :'& error' 오류 포인터와 관련된'managedObjectContext.save (& error)'줄에 오류가 발생했습니다 –

+0

@ZackShapiro : 가져 오기 요청과 마찬가지로'var error : NSError? '가 필요합니다 , 나는 그것을 코드에 추가했다. –

+0

업데이트 해 주셔서 감사합니다. 이 모든 것을 실행 한 후에,'.length'와'.date' 값을 출력하고, 중단 점에 도달하고,'CoreData : warning : 엔티티 'Meditation'클래스에 'Meditation'클래스를로드 할 수 없음을 알려줍니다. . 클래스를 찾을 수 없습니다. 대신 기본 NSManagedObject를 사용하십시오. –

관련 문제