Не удалось сохранить в CoreData.SQLCore dispatchRequest Объект класса "" не входит в список разрешенных классов верхнего уровня - PullRequest
0 голосов
/ 23 сентября 2019

Я получил это сообщение об ошибке при попытке сохранить данные в основных данных.Я думаю, что это может быть что-то сделать, что некоторые из атрибутов в моих сущностей имеют тип Transformable.

Сообщение об ошибке:

[error] error: SQLCore dispatchRequest: exception handling request: <NSSQLSaveChangesRequestContext: 0x60000029c8f0> , Object of class Address is not among allowed top level class list (
    NSArray,
    NSDictionary,
    NSSet,
    NSString,
    NSNumber,
    NSDate,
    NSData,
    NSURL,
    NSUUID,
    NSNull
) with userInfo of (null)

сущностей и их атрибуты в файле .xcdatamodeld (скриншоты):

  1. Ссылка на изображение объекта пользователя
  2. Ссылка на изображение объекта адреса

ПользовательКласс ОБНОВЛЕНО:

@objc(User)
public class User: NSManagedObject, Decodable {

    private enum CodingKeys: String, CodingKey { case address, company , avatar, email, id, name, phone, username, website }

     required convenience public init(from decoder: Decoder) throws {

         guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError("NSManagedObjectContext is missing") }

         let entity = NSEntityDescription.entity(forEntityName: "User", in: context)!
         self.init(entity: entity, insertInto: context)

         let values = try decoder.container(keyedBy: CodingKeys.self)

         address = try values.decode(Address.self, forKey: .address)
         avatar = try values.decode(String.self, forKey: .avatar)
         company = try values.decode(Company.self, forKey: .company)
         email = try values.decode(String.self, forKey: .email)
         id = try values.decode(Int32.self, forKey: .id)
         name = try values.decode(String.self, forKey: .name)
         phone = try values.decode(String.self, forKey: .phone)
         username = try values.decode(String.self, forKey: .username)
         website = try values.decode(String.self, forKey: .website)

     }
}

Адрес Класс ОБНОВЛЕНО ::

@objc(Address)
public class Address: NSManagedObject, Decodable {

    private enum CodingKeys: String, CodingKey { case geo, city, street, suite, zipcode }

        required convenience public init(from decoder: Decoder) throws {

            guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError("NSManagedObjectContext is missing") }

            let entity = NSEntityDescription.entity(forEntityName: "Address", in: context)!
            self.init(entity: entity, insertInto: context)

            let values = try decoder.container(keyedBy: CodingKeys.self)

                street = try values.decode(String.self, forKey: .street)
                suite = try values.decode(String.self, forKey: .suite)
                city = try values.decode(String.self, forKey: .city)
                zipcode = try values.decode(String.self, forKey: .zipcode)
                geo = try values.decode(Geo.self, forKey: .geo)
      }

}

Адрес Класс ОБНОВЛЕНО:

extension Address {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Address> {
        return NSFetchRequest<Address>(entityName: "Address")
    }

    @NSManaged public var city: String
    @NSManaged public var street: String
    @NSManaged public var suite: String
    @NSManaged public var zipcode: String
    @NSManaged public var geo: Geo

}

Все предложения и примеры кодаценятся.Благодарю.:)

1 Ответ

1 голос
/ 23 сентября 2019

Ваша модель данных кода неверна.

Удалите атрибуты address и company.Оба должны быть отношениями.

  • Выберите User, щелкните знак + ниже отношения, назовите его address, выберите Address в качестве пункта назначения.
  • Выберите Addressнажмите на знак + ниже отношения, назовите его user, выберите User в качестве пункта назначения и address в качестве обратного.
  • Вернитесь к User и выберите user в качестве обратного отношения.

Убедитесь, что оба отношения однозначны и что оба объекта @NSManaged объявлены в классах.

Сделайте то же самое для Company и для другого неправильно Преобразуемые атрибуты.

А в init(from decoder необходимо явно указать одно направление отношений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...