2016-07-17 2 views
0

신속한 핵심 데이터에 저장하는 두 개의 개체가 있습니다. 목록은 하나의 객체이고 Item은 다른 객체입니다. 여기 Swift의 NSManagedObject 및 NSCoding을 따르는 간단한 개체를 얻는 방법

는 List 클래스의 :

import Foundation 
import CoreData 

class List:NSManagedObject { 
    /* Remember, any @NSMananged variables added or changed here 
    needs to be reflected in Model */ 
    @NSManaged var name:String 
    @NSManaged var items: [Item] 
} 

그리고 여기에 내가 Item 클래스의 만들어 놓은 난장판이다 : 나는 NSManagedObject, NSObject의 및 NSCoding 약 사과 설명서를 읽고

import Foundation 
import CoreData 

class Item:NSManagedObject, NSCoding { 
    /* Remember, any @NSMananged variables added or changed here 
    needs to be reflected in Model */ 
    @NSManaged var title:String 
    @NSManaged var address:String 
    @NSManaged var notes:String 
    @NSManaged var quantity:Int32 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(title, forKey: "title") 
     aCoder.encodeObject(address, forKey: "add") 
     aCoder.encodeObject(notes, forKey: "notes") 
     aCoder.encodeInt32(quantity, forKey: "qty") 
    } 

    override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 

    } 

    required init(coder aDecoder: NSCoder) { 
     title = aDecoder.decodeObjectForKey("title") as! String 
     address = aDecoder.decodeObjectForKey("add") as! String 
     notes = aDecoder.decodeObjectForKey("notes") as! String 
     quantity = aDecoder.decodeInt32ForKey("qty") 
    } 
} 

그것은 foriegn 언어 일 수 있습니다.

기능을 구현하지 않으면 NSCoding을 준수하지 않습니다. encodeWithCoder()를 구현하고 init()이 필요하면 NSCoding을 준수하지만 NSManagedObject와 일치하도록 다른 init (엔터티 ...)를 추가해야합니다. 이 기능으로 무엇을해야할지 모르겠습니다.

어떤 도움을 주셔서 감사합니다. 더 많은 정보가 필요하다면이 게시물을 편집 해 보겠습니다.

+0

쓰기 얻으려면 왜 당신이 NSCoding''을 준수하기 위해 노력하고있다? – Wain

+0

@Wain List 클래스의 [Item] 항목에 저장할 수 있도록 NSCoding을 준수해야한다는 인상하에있었습니다. 잘못인가? – Roclemir

+0

예, 잘못되었습니다. 핵심 데이터 모델을 설정하여 목록에 항목과 다 대일 관계가있는 경우 모두 처리됩니다. – Paulw11

답변

3

NSCoding을 준수하지 않아도됩니다. 코어 데이터는 NSCoding없이 모델에 정의한 모든 속성을 저장하며 배열에 항목을 넣으려고 아무 것도 구현할 필요가 없습니다.

BUT !!

코어 데이터의 속성을 transformable으로 설정 한 경우 어디로 향하고 있는지 설명하고 NSCoding을 구현해야하지만 관리 대상이 될 수는 없습니다. 이것은 또한 모델에서 관계를 사용해야 할 때 잘못된 접근법이 될 수 있습니다.

+0

감사 Wain. 그래서 그것을 모델에 변형 가능 모델로 두지 마십시오 (이것이 제가 한 것입니다). 변환 할 수없는 경우 배열 유형을 어떻게 설정합니까? 끈? – Roclemir

+0

속성을 삭제하고 대신 양방향 관계를 만든 다음 모델 클래스를 재생성합니다. 엔티티가 될 수 없거나 불가능할 수있는 항목에 변형 가능한 속성을 사용합니다. 관계는 코드에서 세트로 나타납니다. – Wain

+0

이제 저는 정말로 길을 잃고 있습니다. 그런 다음 List 클래스의 특성을 삭제하거나 그대로 둡니까? 삭제하면 항목을 특정 목록과 연관시키는 방법은 무엇입니까? – Roclemir

1

가장 쉬운 방법은 혼란을 정리하기 :

  • 모두 NSManagedObject 서브 클래스를 삭제합니다.
  • 코어 데이터 모델에서 List에서 Item (1 대 다수)까지 관계를 설정하고 역방향 관계는 Item에서 List으로 설정하십시오.
  • NSManagedObject 하위 클래스를 다시 만듭니다.

그게 전부입니다. 이제 핵심 데이터가 모든 것을 관리 할 것입니다. NSCoding 필요 없음.

편집 :

quantity으로 분류 예를 들어 list 개체에 대한 주문 items 배열

let items = (list.items.allObjects as! [Item]).sort{ $0.quantity < $1.quantity } 
+0

입력 해 주셔서 감사합니다. 지금 NSSet을 가지고 있습니다. NSSet은 unorderd입니다. 어떻게 tableviewcells 그것을 함께 채우지, 하나를 선택/삭제되면, 어떻게 그것이 올바른지 확인합니다. – Roclemir

+0

특정 정렬 설명자를 사용하여 가져 오기를 수행하거나 배열을 반환하고 ' 예를 들어. 나는 그 대답을 편집했다. – vadian

+0

감사합니다. 어떻게 작동하는지 알 수 있습니다. 새로운 배열을 처리하기 위해 지금 코드를 모두 고쳐야합니다. 도움에 감사드립니다. – Roclemir

관련 문제