2015-06-17 2 views
2

Я просматриваю NSArray и посылающий, что я получаю на Core Data, например:Swift CoreData сравнить строку с организациями

let json2:NSArray = NSJSONSerialization.JSONObjectWithData(data.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions.MutableContainers, error: &error) as! [NSArray] 

     for dict in json2 { 
      var apps = [String]() 

      //Creation du lien vers la base SQLite 
      let entityDescription = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.context!) 
      let nTask = Task(entity: entityDescription!, insertIntoManagedObjectContext: self.context) 


      let request = NSFetchRequest() 
      request.entity = entityDescription 
      var error: NSError? 
      var objects = self.context?.executeFetchRequest(request, error: &error) 


      if let summary = dict["summary"] as? String{ 
       nTask.summary = summary 
      } 


      if let description = dict["description"] as? String{ 
       nTask.detail = description 
      } 


      if let context = dict["context"] as? String{ 
       nTask.context = context 
      } 


      if let due = dict["due"] as? String { 
       nTask.date = due 
      }else{ 
       nTask.date = "No Ending Date" 
      } 

      if let status = dict["status"] as? String{ 
       nTask.status = status 
      } 

      if let responsible = dict["responsible"] as? String{ 
       nTask.responsable = responsible 
      } 

      if let id = dict["id"] as? String{ 
       nTask.id = id 
      } 

      println(nTask) 



      /*let match = objects![0] as! NSManagedObject 
      let result = match.valueForKey("id") as! String 
      println(result) 

      if result != nTask.id{*/ 
       self.context?.save(nil) 
      //} 

Посыл работает хорошо, основные данные заполняются, кажется, что все будет хорошо ,

Прокомментировано, что я ищу и что не работает в данный момент. Я хочу проверить, является ли nTask.id, который является строкой, значением ключа «id», равным любому id, уже существующему в моей «Задачей» основных данных по атрибуту «id».

Я создаю описание сущности, запрос и возвращаемый запрос, а затем попытаюсь сравнить с nTask.id, но он всегда совпадает, я всегда получаю доступ к моему self.context?.save(nil), я получаю дублоны, и я не делаю хочет..0. Это то, что я пытаюсь сделать:

let entityDescription = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.context!) //creation of the Entity Description for my Entity, "Task" 
    let request = NSFetchRequest() 
    request.entity = entityDescription //Creation of the request on the Entity "Task" 
    var error: NSError? 
    var objects = self.context?.executeFetchRequest(request, error: &error) //Results are sent to my variable objects 
let match = objects![0] as! NSManagedObject 
    let result = match.valueForKey("id") as! String 
    println(result) 

    if result != nTask.id{ //try to compare what the request return with the nTask.id 
     self.context?.save(nil) 
    } 

Я делаю что-то не так или я что-то отсутствует? Я просто хочу проверить, существует ли nTask.id в моем CoreData, и если он не существует, отправьте полную задачу в мою CoreData.

Благодарим за помощь.

С уважением.

ответ

1

Ваш текущий код извлекает ВСЕ объекты Task, но сравнивает id только первого в результирующем массиве (objects). Поэтому дубликаты в другом месте этого массива не будут обнаружены.

Немного перестройте свой код, чтобы проверить, существует ли существующее Task с соответствующими id. Используйте запрос на выборку, который у вас есть, но включайте предикат для извлечения ТОЛЬКО любых объектов Task, которые имеют соответствующие id. Если вы получите 0 результатов, создайте новый Task. Если вы получаете 1 или больше результатов вы должны решить, как справиться с этим, но код ниже будет обновлять значения атрибутов существующего объекта:

for dict in json2 { 
    var apps = [String]() 
    var nTask : Task 

    //Creation du lien vers la base SQLite 
    let entityDescription = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.context!) 

    if let relevantID = dict["id"] as? String { 
     let request = NSFetchRequest() 
     request.entity = entityDescription 
     request.predicate = NSPredicate(format:"id == %@",relevantID) 
     var error: NSError? 
     var objects = self.context?.executeFetchRequest(request, error: &error) 
     if objects!.count == 0 { 
      nTask = Task(entity: entityDescription!, insertIntoManagedObjectContext: self.context) 
     } else { 
      // You need to decide: create a new object and delete the old 
      // update the old object with the new attribute values, or 
      // just ignore the new values 
      // The following will update the existing Task object 
      nTask = objects![0] as! Task 
     } 
    } else { // no `id` to match against, so just create a new Task 
      nTask = Task(entity: entityDescription!, insertIntoManagedObjectContext: self.context) 
    } 
    // Now update the attribute values... 
    if let summary = dict["summary"] as? String{ 
     nTask.summary = summary 
    } 
    if let description = dict["description"] as? String{ 
     nTask.detail = description 
    } 
    if let context = dict["context"] as? String{ 
     nTask.context = context 
    } 
    if let due = dict["due"] as? String { 
     nTask.date = due 
    }else{ 
     nTask.date = "No Ending Date" 
    } 
    if let status = dict["status"] as? String{ 
     nTask.status = status 
    } 
    if let responsible = dict["responsible"] as? String{ 
     nTask.responsable = responsible 
    } 
    if let id = dict["id"] as? String{ 
     nTask.id = id 
    } 
    println(nTask) 

    self.context?.save(nil) 
} 

Обратите внимание, что это должно работать, но это не очень эффективно. Возможно, вы захотите прочитать Руководство по программированию ядра ядра Apple section on "Efficiently importing data" для более эффективных алгоритмов.

+0

Здравствуйте, большое спасибо за ваш ответ, я вижу, что вы сделали, чтобы все понять, это может занять некоторое время ^^ – fselva

+0

Ваше решение работает как шарм, я немного изменил код, который я не распечатывал там, чтобы заставить его работать, и все в порядке. обновление является лучшим решением. Если идентификатор один и тот же, но что-то изменилось, то оно будет обновляться без создания другого. Большое спасибо за вашу помощь! – fselva

Смежные вопросы