如何以一个名称将多个对象保存到 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的主要内容,如果未能解决你的问题,请参考以下文章

在循环中创建多个具有不同名称的对象以存储在数组列表中

如何打开多个 .RDATA 并将其中一个名称保存为 data.frame

在 Python 中直接从内存中保存多个对象以压缩

以多个名称保存一个 excel 文件

将数据框保存到多个 CSV,保留数据框名称

怎样将以保存下来多个.html文件合并在一起生成1个.html文件?