【问题标题】:How to save multiple objects to CoreData, under a single name如何以一个名称将多个对象保存到 CoreData
【发布时间】: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;

}

【问题讨论】:

    标签: ios objective-c uitableview core-data swift3


    【解决方案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) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多