Переменная NSData не сохраняется в CoreData - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь преобразовать изображение, которое пользователь импортировал из рулона камеры, преобразовать изображение в NSData и сохранить его как двоичные данные в CoreData. Мне удалось преобразовать его в двоичный файл и распечатать его, но я не храню значение в основных данных. Мне удалось сохранить строки и другие значения в различных атрибутах объекта, но по какой-то причине двоичные данные не работают.

func savingData(savingImage: UIImage){


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

        let userEntity = NSEntityDescription.entity(forEntityName: "Image", in: managedContext)!

        let data = savingImage.pngData()! as NSData


        if idLabel.text != "" {

            let user = NSManagedObject(entity: userEntity, insertInto: managedContext)
            user.setValue(idLabel.text, forKeyPath: "id")
            user.setValue(descriptionText.text, forKey: "imgdescription")
            user.setValue(confidenceLabel.text, forKey: "confidence")
            user.setValue(data, forKey: "binary")


            do {
                try managedContext.save()
                dataSaved.text = "Your answers have been saved! Click Home to return."


            } catch let error as NSError {
                print("Could not save. \(error), \(error.userInfo)")
                dataSaved.text="Error!"
            }
        }
    }
}

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

Я проверил все соединения, трижды проверил, что именование сущности и атрибутов все еще не работает.

У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: атрибут «двоичный» хранится как «двоичные данные» в основных данных

func retrieveData() {

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

        let managedContext = appDelegate.persistentContainer.viewContext

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Image")

        fetchRequest.fetchLimit = 1
        fetchRequest.predicate = NSPredicate(format: "id = %@", valueSelected)
        fetchRequest.sortDescriptors = [NSSortDescriptor.init(key: "id", ascending: false)]

        do {
            let result = try managedContext.fetch(fetchRequest)
            for data in result as! [NSManagedObject] {
                idText.text = data.value(forKey:"id") as? String
                descriptionText.text = data.value(forKey:"imgdescription") as? String
                confidenceText.text = data.value(forKey:"confidence") as? String
                photoView = data.value(forKey:"binary") as? UIImageView
            }

        } catch {

            print("Nothing found.")
        }
    }

Вот как я это называю в другом классе

1 Ответ

1 голос
/ 27 марта 2019

Основная проблема заключается в том, что вы преобразуете Данные в UIImageView, которые не могут работать.

В методе retrieveData необходимо создать UIImage из данныхи присвойте изображение виду изображения

В основном есть несколько улучшений, которые повышают безопасность.

  • Объявляйте NSManaged объекты с собственными типами Swift (например, Data) и избегайтекак можно больше опций.
  • Используйте всегда точечные обозначения для доступа к атрибутам CoreData, а не подверженные ошибкам KVC
  • Используйте всегда определенный NSFetchRequest, если вы собираетесь получить доступ к определенному объекту

func savingData(savingImage: UIImage){

        // don't guard AppDelegate, the app won't even launch if it was missing so this line would be never reached
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let managedContext = appDelegate.persistentContainer.viewContext

        let imageEntity = NSEntityDescription.entity(forEntityName: "Image", in: managedContext)!

        let data = savingImage.pngData()!


        if !idLabel.text.isEmpty {

            let image = NSManagedObject(entity: imageEntity, insertInto: managedContext) as! Image
            image.id = idLabel.text
            image.imgdescription = descriptionText.text
            image.confidence = confidenceLabel.text
            image.binary = data

            do {
                try managedContext.save()
                dataSaved.text = "Your answers have been saved! Click Home to return."

            } catch let error as NSError {
                print("Could not save. \(error), \(error.userInfo)")
                dataSaved.text="Error!"
            }
        }
    }
}

func retrieveData() {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<Image>(entityName: "Image")
    fetchRequest.fetchLimit = 1
    fetchRequest.predicate = NSPredicate(format: "id = %@", valueSelected)
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]

    do {
        let images = try managedContext.fetch(fetchRequest)
        for image in images {
            idText.text = image.id
            descriptionText.text = image.imgdescription
            confidenceText.text = image.confidence
            if let imageData = image.binary {
               photoView.image = UIImage(data: imageData)
            }
        }

    } catch {
        print("Nothing found.", error)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...