2014-12-17 23 views
12

Tôi mới vào CoreData, đã đọc một vài hướng dẫn nhưng đã đưa ra tay trống. Hầu hết các hướng dẫn đều tập trung vào việc tìm nạp từ CoreData để điền vào một tableview, đó không phải là những gì tôi đang làm vào lúc này.Tìm nạp mục gần đây nhất từ ​​CoreData trong Swift

Đây là cách tôi thiết lập dữ liệu trong CoreData. Tất cả các loại là Double trừ ngày mà là một 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) 
} 

Dưới đây là những gì tôi đang cố gắng để làm gì để có được kết quả, nhưng tôi không thể truy cập những thứ như .minutes, .date, vv Tôi biết tôi 'm cũng không đúng cách nhận được mục cuối cùng, tôi chỉ cố gắng in ra các thuộc tính trên đối tượng đầu tiên.

Tôi rất muốn giúp đỡ về làm thế nào để lấy chỉ các đối tượng gần đây nhất cũng như hiển thị nó là thuộc tính

Cảm ơn!

Trả lời

16

Đầu tiên, tạo tệp "Meditation.swift" trong Xcode bằng "Editor -> Create NSManagedObject Subclass ...". Các tập tin được tạo ra sẽ giống như

import Foundation 
import CoreData 

class Meditation: NSManagedObject { 

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

} 

Bây giờ bạn có thể sử dụng các thuộc tính trực tiếp thay vì Key-Value Mã hóa và tạo ra các đối tượng như

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

Khi lấy đối tượng, đúc kết quả của executeFetchRequest() đến [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)") 
} 

Cuối cùng, chỉ tìm nạp đối tượng mới nhất, thêm một loại d escriptor để sắp xếp các kết quả theo ngày theo thứ tự giảm dần, và hạn chế số lượng kết quả để một:

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

Sau đó, các mảng objects chứa ít nhất một đối tượng, đó là một trong những gần đây nhất.

+0

Martin, đây là một câu trả lời tuyệt vời. Cảm ơn bạn. Tôi đã bỏ lỡ lớp con thực sự hữu ích. Một điều: Tôi gặp lỗi trên dòng 'managedObjectContext.save (& error)' liên quan đến con trỏ lỗi '& error' –

+0

@ZackShapiro: Bạn sẽ cần' var error: NSError? 'Như trong yêu cầu tìm nạp , Tôi đã thêm nó vào mã. –

+0

Cảm ơn bạn đã cập nhật. Sau khi chạy tất cả điều này, tôi làm cho nó in ra các giá trị '.length' và' .date', sau đó nó chạm vào điểm ngắt và nói với tôi 'CoreData: warning: Không thể tải lớp có tên 'Meditation' cho thực thể 'Meditation' . Không tìm thấy lớp, sử dụng NSManagedObject mặc định.' –

Các vấn đề liên quan