2017-05-08 61 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) } 
相关问题