Как получить ObjectID и выполнить поиск по указанным c ObjectID в CoreData в Swift 5? - PullRequest
0 голосов
/ 08 апреля 2020

В настоящее время я работаю над проектом с многопользовательской системой . Пользователь может создавать новые профили, которые постоянно сохраняются с использованием CoreData .

Моя проблема: только один профиль может быть активным в одно время , поэтому я хотел бы получить ObjectID созданного профиля и сохранить его в UserDefaults .

Далее я подумал, что как только мне понадобятся данные активного профиля, я могу просто получить ObjectID из UserDefaults и выполнить READ - Запрос , который возвращает мне только результат с этим специфика c ObjectID .

Мой код для сохранения данных:

// 1. Create new profile entry to the context.
let newProfile = Profiles(context: context)
newProfile.idProfileImage = idProfileImage
newProfile.timeCreated = Date()
newProfile.gender = gender
newProfile.name = name
newProfile.age = age
newProfile.weight = weight

// 2. Save the Object ID to User Defaults for "activeUser".
// ???????????????????
// ???????????????????

// 3. Try to save the new profile by saving the context to the persistent container.
do {
    try context.save()
} catch {
    print("Error saving context \(error)")
}

Мой код для ЧТЕНИЯ ДАННЫХ

// 1. Creates an request that is just pulling all the data.
let request: NSFetchRequest<Profiles> = Profiles.fetchRequest()

// 2. Try to fetch the request, can throw an error.
do {
    let result = try context.fetch(request)
} catch {
    print("Error reading data \(error)")
}

Как видите, я не смог для реализации Часть 2 первого кодового блока . Новый профиль сохраняется, но ObjectID не сохраняется в UserDefaults.

Также Сторона 1 второго блока кода не является конечной целью. Запрос только возвращает вам все данные этой сущности, а не только те, у которых ObjectID, который я сохранил в пользовательских настройках по умолчанию.

Надеюсь, у вас есть идея, как решить эту проблему. Заранее спасибо, ребята, за помощь!

1 Ответ

2 голосов
/ 08 апреля 2020

Поскольку NSManagedObjectID не соответствует одному из типов, обрабатываемых UserDefaults, вам придется использовать другой способ представления идентификатора объекта. К счастью, NSManagedObjectID имеет uriRepresentation(), который возвращает URL, который может быть сохранен в UserDefaults.

. Если вы используете NSPersistentContainer, вот расширение, которое будет обрабатывать хранение и поиск активный пользователь Profile:

extension NSPersistentContainer {
    private var managedObjectIDKey: String {
        return "ActiveUserObjectID"
    }

    var activeUser: Profile? {
        get {
            guard let url = UserDefaults.standard.url(forKey: managedObjectIDKey) else {
                return nil
            }

            guard let managedObjectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: url) else {
                return nil
            }

            return viewContext.object(with: managedObjectID) as? Profile
        }
        set {
            guard let newValue = newValue else {
                UserDefaults.standard.removeObject(forKey: managedObjectIDKey)
                return
            }

            UserDefaults.standard.set(newValue.objectID.uriRepresentation(), forKey: managedObjectIDKey)
        }
    }
}

Этот метод использует NSPersistentStoreCoordinator для создания NSManagedObjectID из представления URI.

...