J'ai une relation un-à-plusieurs qui ressemble à ça,
J'ai configuré mes classes de modèle dans un fichier pour correspondre:
import CoreData
import Foundation
class Board: NSManagedObject {
@NSManaged var boardColor: String
@NSManaged var boardCustomBackground: AnyObject?
@NSManaged var boardID: String
@NSManaged var boardName: String
@NSManaged var lists: NSSet
}
class List: NSManagedObject {
@NSManaged var listID: String
@NSManaged var listName: String
@NSManaged var board: Board
}
Étant donné que je récupère des données à partir de plusieurs points de terminaison JSON, je dois enregistrer mes listes séparément sur mes cartes. Ce que je veux faire, c'est créer/mettre à jour une liste pour une carte avec un boardID correspondant .
Voici où j'en suis après plusieurs tentatives:
func saveList(boardID: String, listName: String, listID: String) {
let request = NSFetchRequest(entityName: "Board")
var error: NSError? = nil
request.predicate = NSPredicate(format: "boardID like %@", boardID)
let results: NSArray = context.executeFetchRequest(request, error: &error)
if results.count > 0 {
for result in results {
let board = result as Board
let list = NSEntityDescription.insertNewObjectForEntityForName("List", inManagedObjectContext: context) as List
println("???? want to save \(listName) in \(board.boardName)")
board.lists.addListObject(lists)
list.listName = listName
list.listID = listID
}
}
}
Basé sur Définir les relations CoreData dans Swift et this , j'ai essayé d'implémenter la réponse de @ Keenle pour définir des objets de liste à l'intérieur d'un tableau:
import Foundation
extension Board {
func addListObject(value:List) {
var items = self.mutableSetValueForKey("lists");
items.addObject(value)
}
func removeListObject(value:List) {
var items = self.mutableSetValueForKey("lists");
items.removeObject(value)
}
}
Cependant, j'ai rencontré l'erreur suivante dans board.lists.addListObject(lists)
: 'NSSet' n'a pas de membre nommé 'addListObject'`
Au lieu de board.lists.addListObject(lists)
, j'ai également essayé board.lists.listName = listName
Comme impliqué dans ce exemple Obj-C , mais cela n'a malheureusement pas fonctionné non plus.
(De plus, la sortie println
spécifie correctement la carte et la liste de droite.)
Merci d'avance!
Dans une relation un-à-plusieurs, il est plus facile de définir la direction "à un" des relations inverses, dans votre cas,
list.board = board
de sorte que les méthodes d'extension ne sont pas réellement nécessaires ici.
Vous devez appeler addListObject(...)
sur board
objet:
board.addListObject(list) // notice that we pass just one object
De plus, si vous voulez pouvoir ajouter un ensemble de listes à un objet board
particulier, vous pouvez améliorer votre extension de classe Board
avec des méthodes qui acceptent un ensemble d'objets:
func addList(values: NSSet) {
var items = self.mutableSetValueForKey("lists");
for value in values {
items.addObject(value)
}
}
func removeList(values: NSSet) {
var items = self.mutableSetValueForKey("lists");
for value in values {
items.removeObject(value)
}
}
Si vous définissez:
@NSManaged var lists: Set<List>
Ensuite, vous pouvez faire:
board.lists.insert(list)