Как преобразовать NSManagedObject в декодируемый класс в Core data Swift

#ios #swift #xcode #core-data #nsmanagedobject

#iOS #swift #xcode #core-data #nsmanagedobject

Вопрос:

Я получаю некоторый ответ сервера, и он имеет следующий формат.

 {
    "sample_id": "Sample 1",
    "token": 2,
    "data": [
        {
            "id": "2",
            "date": "Oct 20 2019"
        },
        {
            "id": "3",
            "date": "Oct 08, 2019"
        }
    ]
}
  

и для этого я создал объект и объявил атрибут как преобразуемый тип.

  static func fetchInfo() -> [Info] {
        
        // Create Fetch Request
        let managedContext = someMethod.getContext()
        let fetchRequest =  NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")

        var result = [Info]()
        do {
            // Execute Fetch Request
            let records = try managedContext.fetch(fetchRequest)
            if let records = records as? [Info] {
                result = records
            }
        }catch {
            print("Unable to fetch managed objects for entity (String(describing: entity)).")
        }
        return result
    }
  

Но в приведенном выше методе он не входит в записи, а данные не присваиваются модельному (декодируемому) классу.

И мой декодируемый класс

 struct Info: Decodable {
    
    let sampleId: String?
    let token: Int?
    let data: [Data]?
    
    enum CodingKeys: String, CodingKey {
        case sampleId = "sample_id"
        case token = "surveys_taken"
        case data = "data"
        
    }
    
}

struct Data: Decodable {
    
    let id: String?
    let date: String?
    
    enum CodingKeys: String, CodingKey {
        case id = “id”
        case date = “date”
    }
}
  

Есть предложения?

Комментарии:

1. Не называйте пользовательские типы так же, как встроенные типы для начала, поэтому переименуйте данные во что-то другое. И вы не можете просто привести подкласс NSManagedObject к вашей информации о структуре, вам нужен некоторый код для сопоставления между ними. Может быть, вы можете добавить код, в котором вы сохраняете информацию в своем хранилище

2. Я только что привел пример для имени объекта в соответствии с конфиденциальностью

Ответ №1:

попробуйте протестировать так

 let fetchRequest: NSFetchRequest<Info> = Info.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "self == %@", self.objectID)
do {
    let result = try context.fetch(fetchRequest)
    if let info = result.first {
         return info
    }
} catch {
    print("Failed to fetch Info: (error)", module: coreDataLogModule)
}

return self
  

Комментарии:

1. Что такое INOLogError? И Info — это структура, а не подкласс NSManagedObject

2. @developer нет атрибута objectiid, у меня есть один атрибут, который является преобразуемым типом

3. @AnilkumariOS-Реактивный Да, есть, если self в данном случае является NSManagedObject, но этот ответ, похоже, вырван из контекста, поэтому его трудно понять.

4. Итак, как преобразовать NSManagedObject в класс модели, есть предложения?

5. @AnilkumariOS-ReactNative Мы не знаем, что конвертировать, поскольку мы не знаем, что / как вы храните в своей сущности.