2017-09-29 10 views
0

Je reçois des données d'un service Web, que je stocke ensuite avec les données de base. Lorsque je reçois de nouvelles données du service Web, il contient des données que j'ai déjà stockées. Dans les données de base, je stocke l'ID unique de chaque jeu de données fourni par le service Web. Dans mon implémentation actuelle, je stocke simplement plusieurs instances d'un ensemble avec un identifiant unique. Mais je veux que l'existant reste, et que le nouveau soit ignoré. Ou, puisqu'ils sont les mêmes de toute façon, le nouveau remplace celui existant. Quelle serait l'approche ici?CoreData insérer de nouvelles données, laisser existant

Merci

+0

Essayez quérir un objet existant avec l'identifiant unique; Si vous n'obtenez pas d'objet, insérez-en un nouveau. – Paulw11

+0

Habituellement, il est préférable de synchroniser l'application avec le serveur. Il suffit donc de mettre à jour tout ce qui vient du serveur. – kirander

+0

S'il vous plaît expliquer ce que vous voulez? Voulez-vous écraser ou non? Si vous ne voulez pas écraser alors s'il vous plaît regardez ce lien de mise en œuvre https://github.com/Gagan5278/DemoApps/blob/master/TwitterDemo/TwitterDemo/Model/TwitterUser%2BCoreDataClass.swift dans ce code, vous pouvez ignorer ' checkForObjectCountWithIdentifier 'fonction. Essayez également d'implémenter la sauvegarde par lots pour de meilleures performances. –

Répondre

0

d'abord, vous devez vérifier qu'un nouvel objet qui est venu de l'API existe dans la base de données en utilisant UNIQID. Si oui, remplacez l'ancien objet par un nouvel objet si vous ne pouvez pas insérer un nouvel objet.

Code Suivez l'échantillon Il pourrait vous aider

//MARK:- get if ClassRoom Exist 
    func getClassroom(_ classRooMID:String) -> Classroom? { 

     var allClassroom:[Classroom]! 
     let request = Classroom.getFetchRequest() 
     let keyVal = classRooMID 
     request.predicate = NSPredicate.init(format: "classroomid = %@", argumentArray: [keyVal]) 
     do { 
      allClassroom = try managedObjectContext.fetch(request) as! [Classroom] 
     } 
     catch let error as NSError{ 
      // failure 
      print("Fetch failed: \(error.localizedDescription)") 
     } 
     if allClassroom.count != 0 { 
      return allClassroom[0] 
     } 
     return nil 
    } 

lors de l'insertion d'un nouvel objet

//MARK:- InsertClassroom Data 
    func insertClassroomData(_ classRoomDict:NSDictionary) -> Classroom { 
     let keyValue = classRoomDict[KEY_CLASS_ROOM_ID] as! String 
     var classroomObj = self.getClassroom(keyValue) 

     if (classroomObj == nil){ 
      classroomObj = NSEntityDescription.insertNewObject(forEntityName: "Classroom", into: managedObjectContext) as? Classroom 
     } 
     classroomObj!.setClassroomFromDict(classRoomDict) 

     return classroomObj! 
    } 

Merci

0
class func defaultInsert(data:[String:Any]) -> AppLabels { 
    var label = self.fetchLabelFromLabelUsingVarID(var_id: data["var_id"] as! String,screen: data["name"] as! String) 
    if label == nil{ 
     label = NSEntityDescription.insertNewObject(forEntityName: "AppLabels", into: CoreDataStack.managedObjectContext) as? AppLabels 
    } 
    if data["var_id"] != nil { 
     label?.var_id = data["var_id"] as? String 
    } 
    if data["name"] != nil { 
     label?.name = data["name"] as? String 
    } 
    if data["value"] != nil { 
     label?.value = data["value"] as? String 
    } 
    if data["var_name"] != nil { 
     label?.var_name = data["var_name"] as? String 
    } 

    return label!; 
} 
class func fetchLabelFromLabelUsingVarID (var_id:String,screen:String) -> AppLabels? { 
    let fetchrequest = NSFetchRequest<AppLabels>(entityName: "AppLabels") 
    fetchrequest.predicate = NSPredicate(format: "var_id == %@ && name == %@", var_id,screen); 
    fetchrequest.fetchLimit = 1; 
    do { 
     let fetchedResults = try CoreDataStack.managedObjectContext.fetch(fetchrequest) 
     if let applabel = fetchedResults.first { 
      return applabel 
     } 
    } 
    catch{ 

    } 
    return nil; 
} 
+0

S'il vous plaît ajouter un peu plus de détails pour votre réponse seulement le code n'aidera pas le questionneur pour résoudre ce problème. – CodeChanger