Datos principales en Swift: solo se guarda el último objeto en un bucle for

Estoy intentando guardar varios objetos en Core Data en la entidad IPodSongs en un ciclo for , es decir, el título de la canción actualmente en el ciclo for song in result{} la for song in result{} . Pero mi código solo guarda la última canción en el ciclo, y simplemente sobrescribe el mismo objeto. En lugar de sobreescribir el mismo objeto, necesito crear un nuevo objeto cada vez. ¿Qué estoy haciendo mal?

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

No necesita crear una solicitud para guardar nuevos objetos en Core Data. Lo que hizo mal fue crear un único objeto administrado, insertarlo y luego cambiarlo a través del bucle en lugar de crear un nuevo objeto para cada canción.

Esto debería funcionar:

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

También ponga if context.save(&errorPointer == false {printlin("Error received while saving")} al final.

Está utilizando el mismo objeto insertado en todas las iteraciones:

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

De hecho, está cambiando el valor del objeto de la canción, pero usa la misma instancia, que a su vez es la misma entidad en el núcleo db.

Necesita usar una nueva instancia para cada nueva canción:

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

Prueba esto, esto funcionará …

Insertar para el loop y guardar en el bucle exterior …

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

Esto funcionará para usted lo más probable! ¡Intentalo!

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