2017-05-08 2 views
0

나는 여러 선택 옵션 (각 행에 URL이 있음)이있는 UITableView가있는 신속한 3.0 프로젝트에서 작업하고 있습니다. 따라서 TableView 위에는 텍스트 필드에 이름을 입력 할 수 있습니다. 내 요구 사항은 일단 이러한 행을 선택하면 데이터는 입력 된 이름으로 coredata에 저장되어야합니다. 현재 데이터는 개별 요소로 저장되므로 이름 아래에 데이터를 클러스터링하는 데 문제가 있습니다. 어떻게하면 이럴 수 있니? 데이터를 저장하고 추출하는 방법.하나의 이름으로 CoreData에 여러 객체를 저장하는 방법

public static func savePlaylistDetails(audio:AudioDetails, playListName: String) { 

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
let context = appDelegate.persistentContainer.viewContext 

let newPlaylist = NSEntityDescription.insertNewObject(forEntityName: PlayList_DETAILS_ENTITY, into: context) 


newPlaylist.setValue(playListName, forKey:"playlistName"); 
newPlaylist.setValue(audio.mediaId, forKey:"trackID"); 

do{ 
    try context.save(); 
    print("Saved.....") 
} 
catch{ 
    print("There was an error") 
} 

}

저장 단일 입력에 대한 모든 데이터를 저장하는 다른 엔티티를 생성해야합니다 일반적으로 저장된 데이터

public static func getPlayList() -> [PlayListDetails]?{ 
let appDelegate = UIApplication.shared.delegate as! AppDelegate; 
let context = appDelegate.persistentContainer.viewContext; 

let request = NSFetchRequest<NSFetchRequestResult>(entityName: PlayList_DETAILS_ENTITY) 
request.returnsObjectsAsFaults = false 

do{ 
    let results = try context.fetch(request) 
    if(results.count > 0){ 
     for result in results as! [NSManagedObject]{ 
      let playListDetails:PlayListDetails? = result as? PlayListDetails 
      print("Title: \(playListDetails?.playlistName)") 


     } 
     return results as? [PlayListDetails] 
    }else{ 
     print("No results") 
    } 

}catch{ 
    print("Error in fetching items") 
} 
return nil; 

}

답변

0

의 압축을 풉니 다. 귀하의 경우 이것은 단일 문자열처럼 보입니다. 그렇게 한 후에는 일대 다 또는 다 대다의 관계를 만들어야합니다. 핵심 데이터 인터페이스 빌더에서이를 쉽게 수행 할 수 있습니다. 일대 다 케이스의 경우 데이터베이스에서 이전 항목을 제거해야하거나 누출이 발생할 수 있습니다. 대다수의 경우 ID 또는 콘텐츠별로 순 쿠키를 추적해야합니다.

그러나 대안이 있습니다. 가장 간단한 방법은 모든 문자열을 단일 문자열로 묶는 문자열의 구분 기호 인 일종의 마커를 만드는 것입니다. 당신이 충분하지만 경우 다음 필요 이것들은 데이터 만 있는지 경우

let names = fullString.components(separatedBy: "[email protected];@-") 

: 당신이 사용하는 것이 직렬화하기 위해 다음

let fullString = ((results as? [PlayListDetails]).flatMap { $0.name })?.joined(separator: "[email protected];@-") 

: 인스턴스가 직렬화하기 위해 당신은 같은 것을 사용하는 것이 다른 필드를 예상 할 수 있습니다. 문자열 대신 변형 가능한 데이터를 사용하고 JSON을 삽입 할 수 있습니다. 당신은 직렬화 것 :

let jsonArray: [[String: Any]] = results.flatMap { ["name": $0.name, "id": $0.id] } 
let jsonData = try? JSONSerialization.data(withJSONObject: jsonArray, options: .prettyPrinted) 

그리고로 역 직렬화 :

let playlistDetails: [PlayListDetails]? = (try? JSONSerialization.jsonObject(with: jsonData!, options: .allowFragments) as? [[String: Any]])?.flatMap { PlayListDetails(name: $0["name"] as? String, id: $0["id"] as? String) } 
관련 문제