6

Tôi có một thực thể trong "ProjName.xcdatamodel" có tên "Câu hỏi". Trong thực thể này tôi có 5 thuộc tính ("icehockey", "bóng chuyền", "bóng đá", ...), mỗi thuộc tính có loại transformable. Mỗi hàng (thuộc tính) sẽ được lấp đầy với một NSMutableArray. Điều tôi muốn làm là lấy giá trị của một thuộc tính cụ thể trong thực thể này. Đây là mã của tôi:Swift lấy NSManagedObject cụ thể từ thực thể (dữ liệu cốt lõi)

func readQuestionsFromCore(sport:NSString) -> NSMutableArray { 
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
    var context:NSManagedObjectContext = appDel.managedObjectContext! 

    var request = NSFetchRequest(entityName: "Questions") 
    request.returnsObjectsAsFaults = false 
    var results: NSArray = context.executeFetchRequest(request, error: nil)! 
    var qArr:NSMutableArray! 
    if results.count > 0 { 
     var res = results[0] as NSManagedObject 
     qArr = res.valueForKey("\(sport)") as NSMutableArray 
     return qArr 
    } else { 
     qArr = [] 
     return qArr 
    } 
} 

này sẽ ofcourse không hoạt động kể từ khi tôi đưa ra các chỉ số đầu tiên của các kết quả từ cơ sở dữ liệu (results[0] as NSManagedObject) và do đó nó sẽ sụp đổ nếu yếu tố đó là không giống như các valueForKey tôi' m tìm kiếm.

Làm cách nào để có được hàng kết quả mà tôi đang tìm kiếm? I E. "bóng đá", hoặc ít nhất tôi có thể bằng cách nào đó lặp lại kết quả và so sánh các khóa của mỗi hàng kết quả để nó không sụp đổ khi tôi thử với khóa sai? Như một cái gì đó như thế này:

for (res) in results as NSManagedObject { 
    if(res.key == "soccer") { 
     qArr = res.valueForKey("soccer") as NSMutableArray 
     return qArr 
    } 
} 

Tôi hy vọng tôi sẽ giải thích rõ ràng!

+0

Trợ giúp sẽ thực sự được đánh giá cao. Tôi đã tìm kiếm trên internet xấu havn't đã có bất kỳ may mắn! – user2099024

+0

Tôi nghĩ bạn cần thêm NSPredicate vào "yêu cầu" của mình. Sau đó, bạn có thể lọc dữ liệu bạn muốn nhận lại từ thực thể. Hãy xem liên kết này ví dụ: http://nshipster.com/nspredicate/ –

+0

@KevinHorgan Hãy thử khi ở nhà! – user2099024

Trả lời

1

phương pháp valueForKey trả về một tùy chọn, bạn có thể sử dụng if let như sau

if let questionsArr = res.valueForKey("\(sport)") as? NSMutableArray { 
    return questionsArr 
} else { 
    return [] 
} 

này hoạt động trong Xcode 6.3.2, nhưng có vẻ như bạn đang sử dụng lớn hơn một. Nếu vậy hãy cập nhật lên phiên bản mới nhất.

1

Tôi không chắc chắn tôi hiểu rõ những gì bạn đang cố gắng đạt được. Nhưng sử dụng chức năng tiếp theo (sử dụng KVC), bạn có thể nhận danh sách thuộc tính lớp và kiểm tra xem bạn có thuộc tính nào không:

func getPropertyList(#classToInspect: AnyObject.Type) -> [String] 
{ 
    var count : UInt32 = 0 
    let properties : UnsafeMutablePointer <objc_property_t> = class_copyPropertyList(classToInspect, &count) 
    var propertyNames : [String] = [] 
    let intCount = Int(count) 
    for var i = 0; i < intCount; i++ { 
     let property : objc_property_t = properties[i] 
     let propertyName = NSString(UTF8String: property_getName(property))! 
     propertyNames.append(propertyName as String) 
    } 
    free(properties) 
    println(propertyNames) 

    return propertyNames 
} 
Các vấn đề liên quan