2016-01-31 3 views
0

Я пытаюсь реализовать собственный класс для обработки операций с основными данными. Он отлично работает при создании новых значений. Однако, когда я хочу обновлять значения, я получаю нулевые записи в основных данных. Вот мой код до сих порОбновление CoreData добавляет много значений nil

/** 
Update all records in given entity that matches input records 
- parameters: 
    - entityName: name of entity to fetch 
    - updateBasedOnKey: name of key which will be used to identify entries that are going to be udpated 
    - values: NSMutableArray of all elements that are going to be updated 
- important: if object with given updateBasedOnKey doesnt exist it will be created 
- returns: nothing 
*/ 
func updateRecord(entity: String, updateBasedOnKey: String, values: NSMutableArray){ 
    let entityDescription = NSEntityDescription.entityForName(
     entity, inManagedObjectContext: self.managedObjectContext) 
    let results = getRecords(entity) 

    for(elements) in values{ 
     var newEntry = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext: self.managedObjectContext) 
     //Determine whether to add new result or update existing 
     if(results.count > 0){ 
      for result in results{ 
       let entry = result as! NSManagedObject 
       if let keyValueToCompare = entry.valueForKey(updateBasedOnKey){ 
        if (keyValueToCompare.isEqual(elements.valueForKey(updateBasedOnKey))){ 
         //asign newEntry to result if found in entries 
         newEntry = entry 
        } 
       } 
      } 
     } 
     //update entry with new values 
     for(key, value) in elements as! NSMutableDictionary{ 
      newEntry.setValue(value, forKey: key as! String) 
     } 
     //Try to save resulting entry 
     do { 
      try newEntry.managedObjectContext?.save() 
     } catch { 
      print(error) 
     } 
    } 
} 

/** 
Fetch all records of given Entity in Core Data Model 
- parameters: 
    - entityName: name of entity to fetch 
- returns: NSArray of all records in given entity 
*/ 
func getRecords(entity:String) -> NSArray{ 
    let entityDescription = NSEntityDescription.entityForName(entity, inManagedObjectContext: self.managedObjectContext) 
    let fetchRequest = NSFetchRequest() 
    fetchRequest.entity = entityDescription 

    var result = NSArray() 

    do { 
     result = try self.managedObjectContext.executeFetchRequest(fetchRequest) 
    } catch { 
     let fetchError = error as NSError 
     print(fetchError) 
    } 
    return result 
} 

Я думаю, что проблема где-то в asigning newEntry NSManagedObject.

Любые идеи, как исправить это и избавиться от нил?

Заранее спасибо

EDIT: это фактический рабочий код, созданный путем внедрения WAIN предложения

func updateRecord(entity: String, updateBasedOnKey: String, values: NSMutableArray){ 
    let entityDescription = NSEntityDescription.entityForName(
     entity, inManagedObjectContext: self.managedObjectContext) 
    let results = getRecords(entity) 

    for(elements) in values{ 
     //set to true if value was already found and updated 
     var newEntry : NSManagedObject? 
     //Determine whether to add new result or update existing 
     if(results.count > 0){ 
      for result in results{ 
       let entry = result as! NSManagedObject 
       if let keyValueToCompare = entry.valueForKey(updateBasedOnKey){ 
        if (keyValueToCompare.isEqual(elements.valueForKey(updateBasedOnKey))){ 
         //asign newEntry to result if found in entries 
         newEntry = entry 
        } 
       } 
      } 
     } 
     if newEntry == nil { 
      newEntry = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext: self.managedObjectContext) 
     } 
     for(key, value) in elements as! NSMutableDictionary{ 
      newEntry!.setValue(value, forKey: key as! String) 
     } 
    } 
} 

ответ

1

Вы правы, проблема заключается в том, что вы создаете и вставить новый объект каждый раз. Вместо этого вы должны передать объект для обновления или выполнения запроса выборки, чтобы найти его, а затем обновить.

Похоже, вы намерены извлечь, а новая запись должна быть ссылкой, а не инициализирована. Итак:

var newEntry : NSManagedObject? 
+0

ohh, так что мне не хватало "?" отметка. Я до сих пор не привык к быстрым вариантам. Я уже пробовал то, что вы предлагаете, но xcode не разрешил мне скомпилировать, потому что я не использовал «?» mark – horin

+0

вы можете проверить код, который я опубликовал в редакции? Это рабочее решение, но я просто хочу быть уверенным, что я сделал это правильно, и что я понимаю, что варианты лучше, чем лучше. – horin

+0

Да, вы определяете необязательную переменную, которую вы можете заполнить позже, а затем использовать – Wain

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