如何以一个名称将多个对象保存到 CoreData
Posted
技术标签:
【中文标题】如何以一个名称将多个对象保存到 CoreData【英文标题】:How to save multiple objects to CoreData, under a single name 【发布时间】:2017-05-08 08:04:38 【问题描述】:我正在 swift 3.0 中开发一个项目,其中我有一个带有多个选择选项的 UITableView(每行都有一个 URL)。因此,在 TableView 的顶部使用可以在文本字段中输入名称。我的要求是,一旦选择了这些行,数据应该以键入的名称保存在 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;
【问题讨论】:
【参考方案1】:一般来说,您应该创建另一个实体来存储单个输入的所有数据。在您的情况下,这看起来像一个字符串。完成此操作后,您需要创建一个关系,在您的情况下应该是一对多甚至多对多。您可以在核心数据接口构建器中轻松做到这一点。在一对多的情况下,您很可能需要从数据库中删除以前的条目,否则您将有泄漏。在多对多中,您需要按 ID 或按内容跟踪唯一性。
但还有其他选择。最简单的方法是创建某种标记,将所有字符串打包成一个字符串分隔符。例如,要对其进行序列化,您可以使用以下内容:
let fullString = ((results as? [PlayListDetails]).flatMap $0.name )?.joined(separator: "-@;@-")
然后你会使用反序列化它:
let names = fullString.components(separatedBy: "-@;@-")
如果您确定这些是您需要的唯一数据,那么这就足够了,但如果您预期其他字段,您可以使用可转换数据而不是字符串并插入 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)
【讨论】:
以上是关于如何以一个名称将多个对象保存到 CoreData的主要内容,如果未能解决你的问题,请参考以下文章