2013-02-27 2 views
0

핵심 데이터를 사용하여 객체를 디스크에 저장하고 sqlite를 사용하는 Mac OS 응용 프로그램이 있습니다.코코아의 배열 컨트롤러 내용 및 순서 유지

모든 NSManagedObject 하위 클래스를 검사 할 수있는 tableView가 있습니다. 이것은 managedObjectContext의 엔티티에 바인드 된 arrayController에 바인딩됩니다.

이 arrayController의 객체를 사용하여 tsv 파일로 내보낼 준비를 위해 객체를 구성하는 데 사용되는 또 다른 tableView를 백업하는 또 다른 arrayController를로드합니다. 이 tableView를 사용하면 드래그 앤 드롭으로 순서 바꾸기 및 항목 제거가 가능하지만 managedObjectContext에 영향을주지는 않습니다.

이 두 번째 arrayController의 내용을 디스크에 유지하는 가장 좋은 방법은 문서를 다시 열 때 tableView가 이전과 같은 순서로 동일한 객체를 갖도록하는 것입니다.

제가 지금까지 작성한 모든 작업은 문서를 닫을 때 설정되는 secondaryArrayOrder라는 managedObjects에 속성을 추가하거나 객체가 보조 arrayController에서 제거되는 경우 nil로 설정하는 것입니다. 이 방법이 효과가 있지만 잘못된 방식으로 접근하는 것처럼 보입니다.

EDIT - 이제 MacRuby 태그를 추가했습니다. 그 언어를 사용하여 내 자신의 질문에 답변했습니다.

+0

확인 diablosnuevos로 대답 HTTP : //stackoverflow.com/questions/1077568/how-to-implement-re-ordering-of-coredata-records. 그것은 단순 해 보인다. 다른 답변도 시도해 볼 수 있습니다. 질문을 게시하기 전에 관련 질문을 검색 할 수 있습니다. – Rakesh

+0

Rakesh에게 감사드립니다. 그러나 제 질문의 마지막 단락에서 제 객체에 주문 필드를 추가하고 싶지는 않습니다. 왜 그들은 그들이 어떤 순서로 관심을 가져야 하는가? – ryecroft

+0

하지만 답장 에서조차도 똑같은 일을하고 있습니다. 관리 대상에 추가하는 대신 objectId를 사용하여 plist를 작성합니다. – Rakesh

답변

0

지금이 방법을 알아 냈습니다.

응용 프로그램이 MacRuby라는 것은 관련이 없으므로 언급하지는 않았지만 내 솔루션을 Objective-C로 완벽하게 번역했다고 확신하지 못했기 때문에 MacRuby로 두십시오.

모든 NSManagedObject는 NSManagedObjectID의 objectID를 가지며 응용 프로그램 내에서이를 고유하게 식별합니다. 따라서 이들을 쉽게 쿼리하여 plist 파일에 문자열로 디스크에 저장할 수 있습니다.

theObjects = arrayController.arrangedObjects 
       .map { |e| e.objectID.URIRepresentation.absoluteString } 

# save theObjects to disk as a plist or json. 

다음 동일한 순서로 응용 프로그램이 시작되어 다음 번에 어레이 컨트롤러의 내용을 다시 사용하거나 문서를 열 때 :

def loadArrayController(arrayOfIDStrings) 
    objects = arrayOfIDStrings.map { |e| 
    url = NSURL.URLWithString(e) 
    moID = managedObjectContext.persistentStoreCoordinator.managedObjectIDForURIRepresentation(url) 
    managedObjectContext.objectWithID(moID) 
    } 
    arrayController.addObjects(objects) 
    arrayController.setSelectedObjects([]) 
end