2017-11-22 14 views
0

나는 Swift를 사용하여 iOS 앱을 개발 중이다.Swift : CSV 파일에서 많은 특성을 가진 국가 목록을 읽고이를 내 앱에 사용하고 싶습니다. 어떻게 구현할 수 있습니까?

나는 csv 파일로 저장된 databank를 가지고 있으며, 주로 응용 프로그램의 핵심입니다. 데이터뱅크에는 많은 속성/설명자 (열)가있는 모든 국가 (행) 목록으로 분할 된 표가 들어 있습니다. 실제로 국가간에 관계가 없습니다.

내가 원하는 것은 내 앱에서 (선택한) 국가에 대해이 정보를 표시 할 수있게하려는 것입니다. 선택한 속성/속성에 따라 검색/필터링/정렬과 같은 다른 작업도 수행합니다.

데이터뱅크는 향후 앱 업데이트가 출시 될 때 업데이트 될 수 있지만 CSV 파일에서 데이터뱅크를 한 번 읽고 앱에서 해당 데이터를 사용하기를 원한다고 생각됩니다.

저는 이것을 구현하는 가장 좋은 방법은 서로 다른 속성을 가진 하나의 엔터티 (국가)가있는 핵심 데이터를 사용하는 것이라고 생각합니까? 그럼 내가해야 할 일은 csv 파일을 한 번 읽고 영구적으로 모든 데이터를 저장하고 거기에서 사용하는 것입니다.

또는 최상의 구현이 아닌 핵심 데이터입니까? 나는 단지 많은 속성을 가진 클래스 Country를 만들고 그것을 사용할까요? 하지만 그 때 응용 프로그램은 열 때마다 csv를 읽고 배열이나 내가 필터링하거나 정렬 싶었 데이터를 저장해야합니다 것을 의미합니까?

제 질문에 대한 요약은 다음과 같습니다. 1. Core Data를 사용하고있을 것인가 말 것인가? 그렇지 않다면 최고의 구현이 무엇이라고 생각합니까? 2. 핵심 데이터를 사용하는 경우 하나의 엔티티 만 만들면됩니다 (관계가 없으므로).

+0

'올바른'또는 '잘못된'답변이 없습니다. CoreData를 확실히 사용할 수 있습니다 (그리고 동기화 된'UITableView's 등의 많은 기능을 무료로 얻을 수 있습니다). 당신이 그것으로 가기로 결정한다면, [여기 있습니다] (https://www.objc.io/issues/4-core-data/importing-large-data-sets-into-core-data/) objc.io 데이터 가져 오기 – Alladinian

+0

답장을 보내 주셔서 감사합니다.내 데이터베이스가 그 나라에 속한 하나의 실체를 포함 할 것이고 다른 모든 것이 실재 국가에 대한 속성으로 떨어질 것이라고 말할 수 있습니까? –

답변

0

당신이 이것을 당신이 선택한 데이터베이스에로드하고 싶은 것이 무엇인가? 따라서 CoreData 또는 SQLite 또는 영역이 적용됩니다.

데이터를 아직 사용할 수없고 신속히로드하려는 경우에는 CSV가 원시 데이터 소스 인 구문 분석과 비슷한 상황에서 작성한 파서입니다 : 당신이 [[String: String]] 형식의 데이터를 후

if let listFile = try? String(contentsOfFile: path) { 
       let lines = listFile.components(separatedBy: "\n") 

       // NOTE: There is also a CSV format that uses ',' as a separator 
       // So verify if yours uses ';' or ',' 
       let rows: [[String: String]] = lines.flatMap() { 
        (item) -> [String: String]? in 
        let components = item.components(separatedBy: ";") 
        if components.count != 3 { 
         return nil 
        } 
        // Modify this part to parse the X amount of columns 
        // you have in your countries.csv 
        let dict = [ 
         "identity": components[0], 
         "description": components[1].lowercased(), 
         "points":  components[2] 
        ] 
        return dict 
       } 
      } 

} 

는 그런 다음 행에 의해 해당 행을 구문 분석하고 사용하기로 결정했습니다 데이터베이스에 삽입 할 수있다.

나는 을 믿습니다. 새로운 Codable 프로토콜을 사용하여 훨씬 더 깨끗해진 결과를 얻으려면 Swift4을 사용해야합니다. 하지만 난 당신이 이것을 할 수 있도록 CSV 파일 (아직)에 대한 인코더/디코더를 작성하지 않았습니다. 사용할 수있는 것이 있으면 여기에 게시하겠습니다.

를 CSV 파서 여기 github에 볼 수 있습니다 : SwiftCSV 내가 그것을 사용한 적이 있지만 누가 알 겠어; 도움이 될지도 모릅니다.

+0

답장을 보내 주셔서 감사합니다. 내 데이터베이스가 그 나라에 속한 하나의 실체를 포함 할 것이고 다른 모든 것이 실재 국가에 대한 속성으로 떨어질 것이라고 말할 수 있습니까? –

+0

@ A.Zada 데이터베이스의 기본 필드가 국가 이름이어야합니다 (CoreData에서 용어를 잊어 버렸지 만 그 기능이 있습니다). 그러면 빨리 찾아보고 쿼리를 수행 할 수 있습니다. 해당 국가의 나머지 데이터는 해당 항목의 속성이어야합니다. CSV 파일을 데이터베이스로 전송하는 것은 필요한 데이터에 효율적으로 액세스하기위한 것입니다. 특정 정보가 필요할 때마다 200 줄 이상의 텍스트를 파싱하는 것이 가장 좋습니다. –

+0

대단히 감사합니다! –