簡體   English   中英

核心數據-[Decodable.Address initWithCoder:]:無法識別的選擇器已發送到實例

[英]Core data -[Decodable.Address initWithCoder:]: unrecognised selector sent to instance

我已經用swift Codable實現了JSON解析並將其存儲在Coredata中 我的代碼在存儲不具有“ transformable”屬性的JSON和獲取實體時工作正常。 但是,如果任何實體的屬性都是可轉換的,則獲取實體會失敗並在以下日志中崩潰。 在自定義對象的情況下,我需要保留可變形的屬性。 看看下面的核心數據模型類和對我的實現的獲取請求。 控制台日志:

-[Decodable.Address initWithCoder:]: unrecognized selector sent to 
instance 0x600000464c40

2018-06-14 11:26:52.768499+0530 Decodable[7870:2988621] [error] error: 
  exception handling request: <NSSQLFetchRequestContext: 0x600000381fb0> 
  , -[Decodable.Address initWithCoder:]: unrecognized selector sent to 
  instance 0x600000464c40 with userInfo of (null)

CoreData: error: exception handling request: 
  <NSSQLFetchRequestContext: 0x600000381fb0> , -[Decodable.Address 
  initWithCoder:]: unrecognized selector sent to instance 0x600000464c40 
  with userInfo of (null)

2018-06-14 11:26:52.777634+0530 Decodable[7870:2988621] *** 
  Terminating app due to uncaught exception 
  'NSInvalidArgumentException', reason: '-[Decodable.Address 
  initWithCoder:]: unrecognized selector sent to instance 
  0x600000464c40'

ViewController.swift

 let request = NSFetchRequest<Clinic>(entityName: "Clinic")
 request.returnsObjectsAsFaults = true

    do
    {
   managedObjectContext = appDelegate.persistentContainer.viewContext

   let result = try managedObjectContext.fetch(request)//***Crashes!!
    }
    catch
    {
        print("no record found")
    }

Clinic + CoreDataClass.swift

import Foundation
import CoreData

public class Clinic: NSManagedObject, NSCoding {


public func encode(with aCoder: NSCoder) {

    aCoder.encode(address, forKey: ClinicCodingKeys.address.rawValue)
  // also encode other class attributes
}

public required convenience init?(coder aDecoder: NSCoder) {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    guard let contextUserInfoKey = CodingUserInfoKey.context,
        let managedObjectContext = 
appDelegate.persistentContainer.viewContext as? 
NSManagedObjectContext,
        let entityDescription = 
NSEntityDescription.entity(forEntityName:"Clinic", in: 
managedObjectContext) else {  fatalError()  }
    self.init(entity: entityDescription, insertInto: 
appDelegate.persistentContainer.viewContext)

    self.address = aDecoder.decodeObject(forKey: 
ClinicCodingKeys.address.rawValue) as? Address
 //*** Also decode other attributes
}

public override func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: ClinicCodingKeys.self)

    try container.encode(remoteid , forKey: .remoteid)
    try container.encode(landline ?? "" , forKey: .landline)
    try container.encode(name ?? "", forKey: .name)
    try container.encode(address , forKey: .address)
    try container.encode(mobile ?? "", forKey: .mobile)
    try container.encode(email ?? "", forKey: .email)
}


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

    guard let contextUserInfoKey = CodingUserInfoKey.context,
        let managedObjectContext = 
    decoder.userInfo[contextUserInfoKey] as? NSManagedObjectContext,
        let entity = 
    NSEntityDescription.entity(forEntityName:"Clinic", in: 
    managedObjectContext) else {  fatalError()  }

    self.init(entity: entity, insertInto: managedObjectContext)
    let values = try decoder.container(keyedBy: ClinicCodingKeys.self)

    remoteid = try values.decode(Int16.self, forKey: .remoteid)
    landline = try values.decode(String.self, forKey: .landline)
    name = try values.decode(String.self, forKey: .name)
    address = try values.decode(Address.self, forKey: .address)
    mobile = try values.decode(String.self, forKey: .mobile)
    email = try values.decode(String.self, forKey: .email)
}
}

Clinic + CoreDataProperties.swift

import Foundation
import CoreData


extension Clinic: Codable {

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

@NSManaged public var remoteid: Int16
@NSManaged public var landline: String?
@NSManaged public var name: String?
@NSManaged public var address: Address?//***** Transformable attribute 
    //for core data model class Address
@NSManaged public var mobile: String?
@NSManaged public var email: String?

enum ClinicCodingKeys: String, CodingKey {
    case remoteid = "_id"
    case landline
    case name
    case address
    case mobile
    case email
}
}

地址+ CoreDataClass.swift

import Foundation
import CoreData


public class Address: NSManagedObject {


public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(address ?? "" , forKey: .address)
    try container.encode(area ?? "" , forKey: .area)
    try container.encode(postalcode ?? "" , forKey: .postalcode)
    try container.encode(city ?? "" , forKey: .city)
    try container.encode(state ?? "" , forKey: .state)
    try container.encode(country ?? "" , forKey: .country)
    try container.encode(lat ?? "" , forKey: .lat)
    try container.encode(lng ?? "" , forKey: .lng)
}

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

    guard let contextUserInfoKey = CodingUserInfoKey.context,
        let managedObjectContext = 
decoder.userInfo[contextUserInfoKey] as? NSManagedObjectContext,
        let entity = 
NSEntityDescription.entity(forEntityName:"Address", in: 
managedObjectContext) else {  fatalError()  }

    self.init(entity: entity, insertInto: managedObjectContext)
    let values = try decoder.container(keyedBy: CodingKeys.self)
    address = try values.decode(String.self, forKey: .address)
    area = try values.decode(String.self, forKey: .area)
    postalcode = try values.decode(String.self, forKey: .postalcode)
    city = try values.decode(String.self, forKey: .city)
    state = try values.decode(String.self, forKey: .state)
    country = try values.decode(String.self, forKey: .country)
    lat = try values.decode(String.self, forKey: .lat)
    lng = try values.decode(String.self, forKey: .lng)

}
}

地址+ CoreDataProperties.swift

import Foundation
import CoreData

extension Address : Codable{

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

@NSManaged public var address: String?
@NSManaged public var area: String?
@NSManaged public var postalcode: String?
@NSManaged public var city: String?
@NSManaged public var state: String?
@NSManaged public var country: String?
@NSManaged public var lat: String?
@NSManaged public var lng: String?

enum CodingKeys: String, CodingKey
{
    case address
    case area
    case postalcode = "postal_code"
    case city
    case state
    case country
    case lat
    case lng
}
}

我已經嘗試在Clinic + CoreDataClass.swift中實現initWithCoder :,但它給出了錯誤-無法調用initWith(entity:insertInto :)。 而且我需要實現initwith(entity:insertinto :)

您錯誤地獲取了它NSFetchRequest<Clinic>(entityName: "Clinic")並且在保存到結果變量之前沒有檢查實體記錄。

  let request = NSFetchRequest<Clinic>(entityName: "Clinic")
     request.returnsObjectsAsFaults = true

        do
        {
       managedObjectContext = appDelegate.persistentContainer.viewContext

       let result = try managedObjectContext.fetch(request)//***Crashes!!
        }
        catch
        {
            print("no record found")
        }

fetchData()函數替換您的代碼,並確保實體名稱相同。

func fetchData()   {
            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let context = appDelegate.persistentContainer.viewContext
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Clinic")
            do{
                 let records = try context.fetch(fetchRequest)

                if let records = records as? [NSManagedObject]{
                    if !records.isEmpty{
                        var result:[NSManagedObject] = records
                        print("coreData result : \(records)")
                    }else{
                       print("No record in Clinic entity")
                    }

                }

            }catch{
                print("Error")
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM