David Sanford
David Sanford

Reputation: 745

Fetching core data issue

I have an array with a SQLite with about 2000 records and all are listed on a tableview. When one of the records are selected, it goes to the "speciesDetailViewController" were it displays details of that item, including the common name of that species.

Currently, all displayed fields are not editable.

I am now adding the ability for the user to to change one of the fields, their common name and the ability to add notes per species.

The minor change is saved in CoreData as I have no experience with SQLite (hired someone).

I am fairly certain the data is being stored as I have print commands showing so.

My issue seems to be retrieving the data.

Note that as editing this field is optional, not every species will have a record in coreData, only the species that the user updated their common name.

class SpeciesDetailData: NSManagedObject
{
    @NSManaged var speciesName: String
    @NSManaged var commonName: String
    @NSManaged var commonForeignName: String
    @NSManaged var speciesNote: String
}

.

var speciesDetailData : SpeciesDetailData?

var speciesDataObject: [NSManagedObject] = []
var speciesNameToSave = String()


@IBAction func ckSaveCommonNameButton(_ sender: Any) {

    speciesNameToSave = speciesLabel.text!
    self.saveSpeciesName(speciesName: speciesNameToSave)

    let commonNameToSave = ckCommonNameTextField.text
    self.saveCommonName(commonName: commonNameToSave!)

   }



func saveCommonName (commonName: String) {

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }

    let managedContext = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "SpeciesDetailData", in: managedContext)!
    let saveEntity = NSManagedObject(entity: entity, insertInto: managedContext)
    saveEntity.setValue(commonName, forKey: "commonName")

    saveSpeciesName(speciesName: speciesNameToSave)

    do {
        try managedContext.save()
        speciesDataObject.append(saveEntity)

        print(commonName)

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

func saveSpeciesName (speciesName: String) {

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }

    let managedContext = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "SpeciesDetailData", in: managedContext)!
    let saveEntity = NSManagedObject(entity: entity, insertInto: managedContext)
    saveEntity.setValue(speciesName, forKey: "speciesName")

    do {
        try managedContext.save()
        speciesDataObject.append(saveEntity)

        print(speciesName)

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

Here is the retrieving function

func retrieveCoreDataSpecies () {

 let context = (UIApplication.shared.delegate
 as! AppDelegate).persistentContainer.viewContext

 let entity = NSEntityDescription.entity(
 forEntityName: "SpeciesDetailData", in: context)


 let request: NSFetchRequest<SpeciesDetailData> = SpeciesDetailData.fetchRequest()
 request.entity = entity

 let pred = NSPredicate(format: "speciesName = %@", specieDetail.specie)
 request.predicate = pred

 do {
 let results = try context.fetch(request as!
 NSFetchRequest<NSFetchRequestResult>)

    if (results.count > 0) {

 let match = results[0] as! NSManagedObject

        if speciesDetailData?.commonName != nil {

            ckCommonNameTextField.text = match.value(forKey: "commonName") as? String

        } else {

        }

        if ckNotesTextView.text == "" || ckNotesTextView.text == nil {
        } else {

            ckNotesTextView.text = match.value(forKey: "speciesNote") as! String
        }
    }

 } catch let error {

 print("Count not fetch \(error), \(error.localizedDescription)")
 }
}

When it gets to the
if speciesDetailData?.commonName != nil it thinks the record is empty and skips over the needed lines.

Any help is appreciated

Upvotes: 0

Views: 36

Answers (1)

closetCoder
closetCoder

Reputation: 1092

You are creating separate objects in the two save functions. In each case you are setting only one of the properties, so after you call saveSpeciesName you will have created an object with species name set, and after you call saveCommonName you will have created a different object with the common name set. You need to set both the species name and the common name on the same object.

Upvotes: 1

Related Questions