2016-02-29 2 views
0

Je souhaite mettre à jour plusieurs attributs d'une entité à l'aide de swift, mais je n'ai trouvé aucun didacticiel pour la gérer. J'ai réussi à mettre à jour seul attribut d'une entité avec le code ci-dessous:Comment mettre à jour plusieurs attributs de données de base dans swift 2

//Insert Function 
func Insert(dbname : String , attributeName : String , value : String) { 
    let check_empty = entityIsEmpty(dbname) 
    if(check_empty != true){ 

    let saveData = NSEntityDescription.insertNewObjectForEntityForName(dbname, inManagedObjectContext: managedContext) 

    // add our data 
    saveData.setValue(value, forKey: attributeName) 

    //2 
    do { 
     try managedContext.save() 
     //3 
     check_DB.append(saveData) 

    } catch let error as NSError { 
     print("Could not save \(error), \(error.userInfo)") 
    } 

    //check_empty 
}else{ 
     //Update procedure 
     let fetchRequest = NSFetchRequest(entityName: dbname) 

     do { 
      let fetchedEntities = try self.managedContext.executeFetchRequest(fetchRequest) as! [SettingInfo] 
      fetchedEntities.first?.attributeName = value 

      // ... Update additional properties with new values 
     } catch { 
      // Do something in response to error condition 
     } 

     do { 
      try self.managedContext.save() 

     } catch { 
      // Do something in response to error condition 
     } 

} 

}

mais comment puis-je mettre à jour plusieurs attributs d'une entité? par exemple: Nom de l'entité est: dbname Nom d'attribut est: attribute _name et la valeur de l'attribut que je veux mettre à jour est: value

MISE À JOUR: message d'erreur: enter image description here

Ma structure de base de données: enter image description here

+0

actualisateurs les autres attributs de la même manière que vous avez fait le premier. Quel est le problème? Au lieu de récupérer l'objet, mettre à jour et enregistrer dans une fonction, avoir une fonction qui retourne l'objet, mettre à jour tous les attributs et ensuite l'enregistrer dans une autre fonction – Paulw11

+0

mon problème est que cette fonction ne reconnaît pas dbname et ses attributs, comme vous peut voir qu'ils sont des arguments de fonction, si je les mets constants cela fonctionne. en ce moment avec le code ci-dessus je reçois erreur de nom de DB n'est pas un type et il ne reconnaît pas le nom de l'attribut – anonymox

+0

@ Paulw11 vous proposez d'avoir 3 fonctions pour faire le travail? chacun fait une seule opération? – anonymox

Répondre

0

vous pouvez utiliser l'accès à clé NSManagedEntities, de sorte que vous pouvez dire

if let entity = fetchedEntities.first { 
    entity[attribute_name]=value 
} 
+0

Vous ne pouvez pas utiliser 'as [nombdd]' car 'nomdb 'est une variable qui contient le nom de votre entité. La requête d'extraction renverra '[NSManagedObject]'. Votre image n'affiche pas la signature de la fonction, donc je ne peux pas dire ce que vous codez, mais 'attribute_name' n'est pas une variable connue, qu'avez-vous dans la liste des paramètres de la fonction? – Paulw11

+0

Merci de répondre, voici ce que j'ai dans la liste des paramètres de fonction: func update (nombase: chaîne, nom_attribut: chaîne, valeur: chaîne) – anonymox

+0

à partir de ce 'nom_attribut 'semble correct. _ sont moche et peut-être vous avez un caractère unicode si vous l'avez copié/collé. Changez-le pour le 'attributeName' plus conventionnel – Paulw11

0

Je l'ai résolu mon problème avec le code suivant:

//Update procedure 
       let fetchRequest = NSFetchRequest(entityName: dbname) 

       do { 
        let fetchedEntities = try self.managedContext.executeFetchRequest(fetchRequest) as! [SettingInfo] 
        let attribute = fetchedEntities[0] as NSManagedObject 
        attribute.setValue(value , forKey: attributeName) 

        // ... Update additional properties with new values 
       } catch { 
        // Do something in response to error condition 
       } 

       do { 
        try self.managedContext.save() 

       } catch { 
        // Do something in response to error condition 
       }