Основные данные — объект, не возвращающий сохраненные данные swift

#swift #database #core-data

#swift #База данных #основные данные

Вопрос:

Я пытаюсь сохранять и загружать данные в core data и из core data.

это моя структура

 struct QuizContact {
    var id: String?
    var status: String?
    var app_installed: Bool?
    var contact_no: String?
    var picture: String?
    var connect_type: String?
    var name: String?
}

extension QuizContact: Codable {
    init(dictionary: [String: Any]) throws {
        self = try JSONDecoder().decode(QuizContact.self, from: JSONSerialization.data(withJSONObject: dictionary))
    }
    private enum CodingKeys: String, CodingKey {
        case id, name, app_installed, status, contact_no, picture, connect_type
    }
}
  

это мой класс обработчика БД

 class DatabaseHandler {
    
    private init() { }
    
    // MARK: Shared Instance
    
    static let shared = DatabaseHandler()
    
    // MARK: Local Variable
    
    var managedObjectContext : NSManagedObjectContext? = {
        if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            return appDelegate.persistentContainer.viewContext
        } else {
            return nil
        }
    }()
    
    func saveContactsToDB(contact: QuizContact) {
        if let managedObjectContext = managedObjectContext {
            
            var isUserContactSaved = false
            
            if let id = contact.id {
                let userConatctsFromDB = fetchSavedUserContatcsVideos(id: id)
                
                if userConatctsFromDB.isEmpty {
                    isUserContactSaved = true
                }
            }
            
            if !isUserContactSaved {
                let entity = NSEntityDescription.entity(forEntityName: "UserContactInDB", in: managedObjectContext)!
                let contactMO = UserContactInDB(entity: entity, insertInto: managedObjectContext)
                contactMO.name = contact.name
                contactMO.contact_no = contact.contact_no
                contactMO.id = contact.id
                contactMO.status = contact.status
                contactMO.app_installed = contact.app_installed ?? false
            }
            
            do {
              try managedObjectContext.save()
                print("Saved to database (contact.name ?? "") (contact.contact_no ?? "")")
            } catch {
                print("Could not save to database (contact.name ?? "") (contact.contact_no ?? ""). Error:  (error.localizedDescription)")
            }
        }
    }
    
    func fetchSavedUserContatcsVideos(id: String) -> [UserContactInDB] {
        return fetchUserContactsFromDB(predicate: NSPredicate(format: "id contains[c] %@ ", id))
    }
    
    func fetchUserContactsFromDB(predicate: NSPredicate? = nil) -> [UserContactInDB] {
        if let managedObjectContext = managedObjectContext {
            let fetchRequest = NSFetchRequest<UserContactInDB>(entityName: "UserContactInDB")

            if let predicate = predicate {
                fetchRequest.predicate = predicate
            }
            
            do {
              return try managedObjectContext.fetch(fetchRequest)
            } catch {
              print("Could not fetch. (error.localizedDescription)")
            }
        }
        return []
    }
}
  

Оператор печати для сохранения контакта работает. Я вижу результаты печати.

Но когда я извлекаю его с помощью let contactsFromDB = DatabaseHandler.shared.fetchUserContactsFromDB(predicate: nil) , он всегда выдает пустой массив.

Я попытался добавить точку останова в return try managedObjectContext.fetch(fetchRequest) , fetchRequest напечатанный NSFetchRequest<UserContactInDB> = <extracting data from value failed>

Может ли кто-нибудь подсказать мне, в чем проблема?

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

1. Если isUserContactSaved значение true, ничего не будет сохранено, но упомянутый вами оператор печати все равно будет выполнен, возможно, вам следует перепроверить это. И, возможно, вам следует реорганизовать эту часть, чтобы поток через эту функцию стал более прямым

2. @JoakimDanielson Спасибо, что указали … я вижу свою ошибку