Невозможно сохранить [String] как двоичные данные в Core Data - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь использовать Базовые Данные для хранения объектов Тревоги, каждый из которых имеет массив String NotificationUuids, которые соответствуют уведомлениям, за которые отвечает Тревога.Проблема в том, что когда я сохраняю объекты сигналов тревоги вот так ...

private func saveAlarm(alarmToSave: Alarm) {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
    }
    let managedContext = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Alarm", in: managedContext)!
    let alarmMO = AlarmMO(entity: entity, insertInto: managedContext)

    alarmMO.setValue(alarmToSave.alarmTime, forKeyPath: "alarmTime")
    alarmMO.setValue(alarmToSave.alarmNumber, forKeyPath: "alarmNumber")
    alarmMO.setValue(alarmToSave.alarmIntervalBeginTimeDouble, forKeyPath: "startTimeInterval")
    alarmMO.setValue(alarmToSave.alarmIntervalEndTimeDouble, forKeyPath: "endTimeInterval")
    alarmMO.setValue(alarmToSave.recurrence.hashValue, forKeyPath: "recurrence")

    let arrayAsString: String = alarmToSave.notificationUuids.description
    let stringAsData = arrayAsString.data(using: String.Encoding.utf16)
    alarmMO.setValue(stringAsData, forKeyPath: "notificationUuids")

    if managedContext.hasChanges {
        do {
            try managedContext.save()
            self.alarms.append(alarmMO)
        } catch let error as NSError {
            print("Could not save alarm to CoreData. \(error), \(error.userInfo)")
        }
    } else {
        os_log("No changes to the context to save", log: OSLog.default, type: .debug)
    }

}

, а затем пытаюсь загрузить сигналы тревоги вот так ...

private func loadAlarms() {

    os_log("loadAlarms() called", log: OSLog.default, type: .debug)
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
    }
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<AlarmMO>(entityName: "Alarm")

    do {
        if self.alarms.count == 0 {
            self.alarms = try managedContext.fetch(fetchRequest)
            os_log("Loading %d alarms", log: OSLog.default, type: .debug, self.alarms.count)
        } else {
            os_log("Didn't need to load alarms", log: OSLog.default, type: .debug)
        }
    } catch let error as NSError {
        print("Could not fetch alarms. \(error), \(error.userInfo)")
    }

}

все остальные полязагружаться, но NotificationUuids не.Почему этот метод преобразования массива String в двоичные данные не работает в Core Data?Я пробовал так много вещей ...

  • Установка типа атрибута для Transferable, пользовательский класс на [String], без преобразователя значения
  • Установка типа атрибута на Transferable, CustomКласс для NSArray, нет Преобразователь значения
  • Установка типа атрибута для переносимого, Пользовательский класс для [String], Преобразователя значения для StringToDataTransformer ниже
  • Установка типа атрибута для Переносимого, пользовательского класса для [NSAttributedString], Преобразователь значения в AttributedStringToDataTransformer ниже
  • Установка типа атрибута в Transferable, Пользовательский класс в [NSString], Преобразователь значения в NSStringToDataTransformer ниже
  • Установка типа атрибута в двоичные данные

и ничего не работает.Я в отчаянии здесь.В чем проблема?

...