#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 Спасибо, что указали … я вижу свою ошибку