Почему строковый массив может храниться неправильно в Базовых данных? - PullRequest
0 голосов
/ 30 ноября 2018

Мой сценарий состоит в том, что у меня есть аварийные сигналы, каждый из которых содержит массив UUID уведомлений, которые действуют как идентификатор для уведомлений, за которые отвечает аварийный сигнал.Я установил эти UUID в объекте Alarm, когда создается тревога.Он проверяет, сколько уведомлений я могу создать (максимум 64 одновременно, прежде чем вы начнете избавляться от других уведомлений), и создает либо 1 (для сегодняшних или завтрашних тревог), либо столько, сколько возможно (для ежедневных тревог; я знаю, что я ')Мне придется изменить это, чтобы оно было ниже в будущем, иначе будет достаточно иметь один ежедневный сигнал тревоги, и я этого не хочу).

Хорошо, поэтому я сохраняю эти сигналы тревоги в Базовых управляемых объектах данных, например, в saveAlarm ():

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")
alarmMO.setValue(alarmToSave.notificationUuids, 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)
}

В моем файле .xcdatamodeld у меня есть атрибуты visibleUuids, сохраняемый как тип трансформируемого объектасо свойством Custom Class [String]

.xcdatamodeld file

Вот странная вещь: эта настройка работает, если я сохраняю только 1 сигнал тревоги в Core Data,Когда я иду, чтобы удалить уведомления в removeNotifications (), я хочу удалить уведомления, которые все еще запланированы, у которых есть messagesUuids, которые присоединены к этому объекту Alarm.И это работает, если было создано только одно уведомление (в случае тревог сегодня или завтра), но не работает, если было создано более одного уведомления (в случае ежедневной тревоги).Я знаю, что это проблема с моей реализацией Core Data, потому что источником этих messagesUuids является управляемый объект:

// Up here I call notificationCenter.getPendingNotificationRequests(). All of this code is wrapped by this call.
for request in requests {
    activeNotificationUuids.append(request.identifier)
}
for alarm in self.alarms {
    guard let alarmUuids = alarm.value(forKey: "notificationUuids") as! [String]? else {
        os_log("Found nil when attempting to unwrap notificationUuids in deleteOldAlarms() in AlarmTableViewController.swift, cancelling",
                   log: OSLog.default, type: .default)
        return
    }
    let activeNotificationUuidsSet: Set<String> = Set(activeNotificationUuids)
    let alarmUuidsSet: Set<String> = Set(alarmUuids)
    let union = activeNotificationUuidsSet.intersection(alarmUuidsSet)
    if union.isEmpty {
        alarmsToDelete.append(alarm)
    }
}
for alarmMOToDelete in alarmsToDelete {
    self.removeNotifications(notificationUuids: alarmMOToDelete.notificationUuids)
    managedContext.delete(alarmMOToDelete)
    self.alarms.removeAll { (alarmMO) -> Bool in
        return alarmMOToDelete == alarmMO
    }
}

Сигналы тревоги в self.alarms являются объектами AlarmMO, определенными так:

import CoreData

class AlarmMO: NSManagedObject {

    @NSManaged var alarmTime: Date?
    @NSManaged var alarmNumber: Int
    @NSManaged var startTimeInterval: Double
    @NSManaged var endTimeInterval: Double
    @NSManaged var recurrence: Int
    @NSManaged var notificationUuids: [String]

}

Мысли?Может ли массив неправильно храниться в виде массива, а только как одна строка, если не указано более одного?

...