【问题标题】:How to save several objects into relationship entity. Xcode如何将多个对象保存到关系实体中。 Xcode
【发布时间】:2015-08-24 18:17:54
【问题描述】:

我在数组中有数据。我将它们加载到 UITableViewController 中,当我选择一个单元格时,单元格中的数据会添加到数组中。然后我想将 Array 中的数据保存到 Core Data 中,但我做不到。我只能保存一个文件。我怎样才能做到?

@IBAction func saveAllData(sender: UIBarButtonItem) {
    var index = tableView.indexPathForSelectedRow()!
    var row = tableView.indexPathForSelectedRow()!.row
    var playlistEntity = NSEntityDescription.insertNewObjectForEntityForName("Playlist", inManagedObjectContext: managedObjectContext) as! NSManagedObject
    var songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject

    if boolForName == true {
        playlistEntity.setValue(currentSong, forKey: "namePlaylist")
        boolForName = false
    }

    for item in arraySong {
        println(item)
        songEntity.setValue(item, forKey: "dataSong")
    }
    playlistEntity.setValue(NSSet(object: songEntity), forKey: "song")
    managedObjectContext.save(nil)
    println("play list \(playlistEntity)")
    println("song entity \(songEntity)")
    var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
    var navi = storyboard.instantiateViewControllerWithIdentifier("navi") as! UINavigationController
    presentViewController(navi, animated: true, completion: nil)
}

更新 我重新制作了这段代码,但它保存了相同的代码。

@IBAction func saveAllData(sender: UIBarButtonItem) {
    var index = tableView.indexPathForSelectedRow()!
    var row = tableView.indexPathForSelectedRow()!.row
    println(index)
    println(currentArray[row])
    var currentFile = currentArray[row]

    var playlistEntity = NSEntityDescription.insertNewObjectForEntityForName("Playlist", inManagedObjectContext: managedObjectContext) as! NSManagedObject
    var songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject

    if boolForName == true {
        playlistEntity.setValue(currentSong, forKey: "namePlaylist")
        boolForName = false
    }

    for item in arraySong {
        songEntity.setValue(item, forKey: "dataSong")
        playlistEntity.setValue(NSSet(object: songEntity), forKey: "song")
        managedObjectContext.save(nil)
        println(songEntity)
    }
    managedObjectContext.save(nil)
    println("play list \(playlistEntity)")
    println("song entity \(songEntity)")
    var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
    var navi = storyboard.instantiateViewControllerWithIdentifier("navi") as! UINavigationController
    presentViewController(navi, animated: true, completion: nil)
}

更新

var arraySong = [String]()
// MARK: IBAction func
@IBAction func saveAllData(sender: UIBarButtonItem) {
    var row = tableView.indexPathForSelectedRow()!.row
    var currentFile = currentArray[row]

    var playlistEntity = NSEntityDescription.insertNewObjectForEntityForName("Playlist", inManagedObjectContext: managedObjectContext) as! NSManagedObject
    var songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject

    if boolForName == true {
        playlistEntity.setValue(currentSong, forKey: "namePlaylist")
        boolForName = false
    }

    for item in arraySong {
        songEntity.setValue(item, forKey: "dataSong")
        playlistEntity.setValue(NSSet(object: songEntity), forKey: "song")
        managedObjectContext.save(nil)
        println("play list \(playlistEntity)")
        println("song entity \(songEntity)")
    }
    managedObjectContext.save(nil)

    var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
    var navi = storyboard.instantiateViewControllerWithIdentifier("navi") as! UINavigationController
    presentViewController(navi, animated: true, completion: nil)
}

我试过了,但我只保存了数组中的最后一个对象。

  for var x = 0; x < arraySong.count; x++ {
            var item = arraySong[x]
                println(item)
                songEntity.setValue(item, forKey: "dataSong")
                playlistEntity.setValue(NSSet(object: songEntity), forKey: "song")
                managedObjectContext.save(nil)
                //            println("play list \(playlistEntity)")
                //            println("song entity \(songEntity)")
            println(songEntity)
        }

所以我将 UITableViewController 中的歌曲添加到数组中。

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.None)
    var row = tableView.indexPathForSelectedRow()!.row
    var song = currentArray[row]
    arraySong.append(song)
    var cell = tableView.cellForRowAtIndexPath(indexPath)!
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
}

更新 2

我试过了

for var x = 0; x < arraySong.count; x++ {
        var item = arraySong[x]
            println(item)
            var songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject
            songEntity.setValue(item, forKey: "dataSong")
            playlistEntity.setValue(NSSet(object: songEntity), forKey: "song")
            managedObjectContext.save(nil)
            //            println("play list \(playlistEntity)")
            //            println("song entity \(songEntity)")
        println(songEntity)
    }

更新 3 我仍然尝试了这种方法,但我只保存了我选择的第一个对象。有什么方法吗?如何为特定播放列表(另一个实体)保存几首歌曲(对象)?

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.None)
        var indexPath = tableView.indexPathForSelectedRow()!
        var row = tableView.indexPathForSelectedRow()!.row
        var song = currentArray[row]
//        arraySong.append(song)
        var cell = tableView.cellForRowAtIndexPath(indexPath)!
        cell.accessoryType = UITableViewCellAccessoryType.Checkmark

        var playlistEntity = NSEntityDescription.insertNewObjectForEntityForName("Playlist", inManagedObjectContext: managedObjectContext) as! NSManagedObject
        var songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject

        if boolForName == true {
            playlistEntity.setValue(currentSong, forKey: "namePlaylist")
            boolForName = false
        }

        songEntity.setValue(song, forKey: "dataSong")
        playlistEntity.setValue(NSSet(object: songEntity), forKey: "song")
        managedObjectContext.save(nil)

        println(songEntity)
    }

我还是试过了。

   override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.None)
    var indexPath = tableView.indexPathForSelectedRow()!
    var row = tableView.indexPathForSelectedRow()!.row
    var song = currentArray[row]
    arraySong.append(song)
    var cell = tableView.cellForRowAtIndexPath(indexPath)!
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark

    let playlistEntity = NSEntityDescription.insertNewObjectForEntityForName("Playlist", inManagedObjectContext: managedObjectContext) as! NSManagedObject
    let songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject

    if boolForName == true {
        playlistEntity.setValue(currentSong, forKey: "namePlaylist")
        boolForName = false
    }

    for var digit = 0; digit < arraySong.count; digit++ {
        var savedSong = arraySong[digit]
        songEntity.setValue(savedSong, forKey: "dataSong")
        playlistEntity.setValue(Set(arrayLiteral: songEntity), forKey: "song")
        managedObjectContext.save(nil)

    }

实体

import Foundation
import CoreData

@objc(Playlist)
class Playlist: NSManagedObject {

    @NSManaged var namePlaylist: String
    @NSManaged var song: NSSet
}

import Foundation
import CoreData

@objc(Song)
class Song: NSManagedObject {

    @NSManaged var dataSong: String
    @NSManaged var playlist: Playlist

}

Core Data 中的关系实体

更新 4 我试过了,但这种方法保存了几个新的播放列表。我就知道。谁能以编程方式向我展示它?

   override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.None)
    //
    let indexP = tableView.indexPathForSelectedRow()!
    let row = tableView.indexPathForSelectedRow()!.row
    var song = currentArray[row]

    var cell = tableView.cellForRowAtIndexPath(indexPath)!
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark

    let playlistEntity = NSEntityDescription.insertNewObjectForEntityForName("Playlist", inManagedObjectContext: managedObjectContext) as! NSManagedObject
    let songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song", inManagedObjectContext: managedObjectContext) as! NSManagedObject

    songEntity.setValue(song, forKey: "dataSong")
    playlistEntity.setValue(Set(arrayLiteral: songEntity), forKey: "song")
    println(songEntity)
    println(playlistEntity)
    managedObjectContext.save(nil)
}

【问题讨论】:

  • 我不明白“我只能保存一个文件” 是什么意思。 Core Data 通常只有一个持久化存储文件。你的代码到底是怎么不工作的?
  • @TomHarrington 我只能将数组中的最后一个对象保存到核心数据中。
  • 您正在为实体 Song 插入 one 对象,然后在重复循环中一次又一次地覆盖该单个实例的数据。 每首首歌曲需要一个对象
  • 我怎样才能做到?我想让我从 UITableViewController 中选择对象并将其保存到核心数据中,我想制作一个播放列表。我更新了上面的代码。 @vadian
  • 我对CoreData不太熟悉,但至少尝试在重复循环中移动var songEntity = NSEntityDescription.insertNewObjectForEntityForName("Song",…行以插入多个对象并在重复循环中删除save行,就足够了保存一次数据

标签: ios arrays xcode swift


【解决方案1】:

每次选择一行时,您都会创建一个新播放列表和一首新歌曲。在选择歌曲之前创建播放列表,并且仅在添加新歌曲时更新关系。

【讨论】:

  • 我假设您的歌曲和播放列表已连接。我不知道你的数据模型的细节。
  • 我截图了,请查收。我认为我必须将歌曲添加到特定的播放列表中,但我不知道如何制作。
  • 如果你使用as! Song创建你的songEntity,你应该可以只使用songEntity.playlist = playlistEntity
  • 不,我不知道。我创造! NSManagedObject
  • 您是否需要仅将其称为其父级?
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多