2017-05-08 12 views
0

我正在使用swift 3.0中的一個項目,其中有一個帶有多選項(每行有一個URL)的UITableView選項。因此,在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 fullString = ((results as? [PlayListDetails]).flatMap { $0.name })?.joined(separator: "[email protected];@-") 

然後反序列化它,你可以使用:

let names = fullString.components(separatedBy: "[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) } 
相關問題