Dati principali in Swift: salva solo l’ultimo object in un ciclo for

Sto cercando di salvare più oggetti in Core Data sull’ quadro IPodSongs in un ciclo for , ovvero il titolo della canzone attualmente nella for song in result{} loop. Ma il mio codice salva solo l’ultima canzone del ciclo e continua a sovrascrivere lo stesso object. Invece di sovrascrivere lo stesso object, ho bisogno di creare un nuovo object ogni volta. Che cosa sto facendo di sbagliato?

 func fetchiPodSongsOnSignup() { var appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate var context: NSManagedObjectContext = appDel.managedObjectContext! var newSong = NSEntityDescription.insertNewObjectForEntityForName("IPodSongs", inManagedObjectContext: context) as! NSManagedObject var request = NSFetchRequest(entityName: "IPodSongs") request.returnsObjectsAsFaults = false var results = context.executeFetchRequest(request, error: nil) let query = MPMediaQuery.songsQuery() let result = query.collections as! [MPMediaItemCollection] for song in result { for song in song.items as! [MPMediaItem] { newSong.setValue("\(song.valueForProperty(MPMediaItemPropertyTitle))", forKey: "title") println(newSong) context.save(nil) } } 

Non è necessario creare una richiesta per salvare nuovi oggetti in Core Data. Quello che hai sbagliato è stato creare un singolo object gestito, inserirlo e poi modificarlo attraverso il ciclo invece di creare un nuovo object per ogni canzone.

Questo dovrebbe funzionare:

 func fetchiPodSongsOnSignup() { var appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate var context: NSManagedObjectContext = appDel.managedObjectContext! let query = MPMediaQuery.songsQuery() let result = query.collections as! [MPMediaItemCollection] for song in result { for song in song.items as! [MPMediaItem] { var newSong = NSEntityDescription.insertNewObjectForEntityForName("IPodSongs", inManagedObjectContext: context) as NSManagedObject newSong.setValue("\(song.valueForProperty(MPMediaItemPropertyTitle))", forKey: "title") println(newSong) } } if context.save(&errorPointer == false { printlin("Error received while saving") } } 

if context.save(&errorPointer == false {printlin("Error received while saving")} anche if context.save(&errorPointer == false {printlin("Error received while saving")} alla fine.

Stai utilizzando lo stesso object inserito in tutte le iterazioni:

 for song in song.items as! [MPMediaItem] { newSong.setValue("\(song.valueForProperty(MPMediaItemPropertyTitle))", forKey: "title") 

In effetti stai cambiando il valore dell’object della canzone ma usi la stessa istanza che a sua volta è la stessa quadro nel core db.

Devi usare una nuova istanza per ogni nuova canzone:

  var newSong = NSEntityDescription.insertNewObjectForEntityForName("IPodSongs", inManagedObjectContext: context) as! NSManagedObject newSong.setValue("\(song.valueForProperty(MPMediaItemPropertyTitle))", forKey: "title") 

Prova questo, questo funzionerà ….

Inserisci in ciclo for e salva in ciclo esterno …

 func fetchiPodSongsOnSignup() { var appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate var context: NSManagedObjectContext = appDel.managedObjectContext! let query = MPMediaQuery.songsQuery() let result = query.collections as! [MPMediaItemCollection] for song in result { for song in song.items as! [MPMediaItem] { var newSong = NSEntityDescription.insertNewObjectForEntityForName("IPodSongs", inManagedObjectContext: context) as NSManagedObject newSong.setValue("\(song.valueForProperty(MPMediaItemPropertyTitle))", forKey: "title") context.insert(newSong) } } context.save(nil) } 

Molto probabilmente funzionerà per te! Provalo!

 for song in result { for song in song.items as! [MPMediaItem] { var newSong = NSEntityDescription.insertNewObjectForEntityForName("IPodSongs", inManagedObjectContext: context) as! NSManagedObject newSong.setValue("\(song.valueForProperty(MPMediaItemPropertyTitle))", forKey: "title") println(newSong) context.save(nil) } }