2017-05-08 2 views
0

Ich arbeite an einem Projekt in Swift 3.0, wo ich eine UITableView mit mehreren Auswahloption (jede Zeile hat eine URL). Daher kann die TableView-Anwendung oben in einem Textfeld einen Namen eingeben. Meine Anforderung ist, sobald diese Zeilen ausgewählt wurden, sollten die Daten in Kerndaten unter dem eingegebenen Namen gespeichert werden. Ab sofort werden die Daten als einzelne Elemente gespeichert, daher habe ich Probleme mit dem Clustering von Daten unter ihrem Namen. Wie könnte ich das erreichen? Die Methode, die ich speichern und extrahieren Daten wie folgt.So speichern Sie mehrere Objekte in CoreData unter einem einzigen Namen

speichern

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") 
} 

}

extrahieren Sie die gespeicherten Daten

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; 

}

Antwort

0

Im Allgemeinen sollten Sie ein anderes Unternehmen zu schaffen, die alle Daten für einen einzelnen Eingang speichert. In Ihrem Fall sieht das wie eine einzelne Saite aus. Nachdem Sie dies getan haben, müssen Sie eine Beziehung erstellen, die in Ihrem Fall Eins-zu-Viele oder sogar Viele-zu-Viele sein sollte. Sie können dies einfach im Core Data Interface Builder tun. Im Eins-zu-Viele-Fall werden Sie höchstwahrscheinlich die vorherigen Einträge aus der Datenbank entfernen müssen oder Sie werden ein Leck haben. In vielen zu vielen müssen Sie Uniques nach ID oder nach Inhalt verfolgen.

Aber es gibt Alternativen. Am einfachsten wäre es, eine Art Marker zu erstellen, ein Trennzeichen für Strings, um alle Strings in ein einziges zu packen. Zum Beispiel es serialisiert würden Sie so etwas wie verwenden:

let fullString = ((results as? [PlayListDetails]).flatMap { $0.name })?.joined(separator: "[email protected];@-") 

Dann ist es zu deserialisiert verwenden Sie:

let names = fullString.components(separatedBy: "[email protected];@-") 

Wenn Sie sicher sind dies die einzigen Daten müssen Sie dann dieses genug ist, aber wenn Sie erwarten andere Felder, in denen Sie transformierbare Daten anstelle von string verwenden können, und fügen Sie einen JSON ein. Sie würden es als serialisiert:

let jsonArray: [[String: Any]] = results.flatMap { ["name": $0.name, "id": $0.id] } 
let jsonData = try? JSONSerialization.data(withJSONObject: jsonArray, options: .prettyPrinted) 

Und deserialisieren es als:

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) } 
Verwandte Themen