web-dev-qa-db-fra.com

Enregistrement des relations Core-to-many dans Swift

J'ai une relation un-à-plusieurs qui ressemble à ça,

coredata model

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!

18
Pirijan

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.

30
Martin R

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

Si vous définissez:

@NSManaged var lists: Set<List>

Ensuite, vous pouvez faire:

board.lists.insert(list)
3
FranMowinckel