Я пытаюсь сохранить строку в модели данных CoreData. Я считаю, что процесс сохранения работает нормально, однако я создал переменную text
, которая просто содержит сообщение-заполнитель, прежде чем пользователь сохранит строку в базе данных. При перезапуске приложения все сохраненные сообщения снова заменяются текстом-заполнителем, при этом все сохраненные сообщения, созданные в предыдущем сеансе, теряются.
ClientData
- это имя сущности, а presetMessage
- это атрибут внутри. Тип presetMessage
String
.
ClientData + CoreDataClass.swift
import Foundation
import CoreData
@objc(ClientData)
public class ClientData: NSManagedObject {
@objc (setMessage:)
public func setMessage(_ presetMessage: String?) {
}
}
ClientData + CoreDataProperties.swift
import Foundation
import CoreData
extension ClientData {
@nonobjc public class func fetchRequest() -> NSFetchRequest<ClientData>{
return NSFetchRequest<ClientData>(entityName: "ClientData")
}
@NSManaged public var presetMessage: String?
}
ViewController.swift
import UIKit
import CoreData
var text = "Placeholder Text"
class ViewController: UIViewController {
var messageSaved = [ClientData]()
override func viewDidLoad() {
super.viewDidLoad()
let fetchRequest: NSFetchRequest<ClientData> = ClientData.fetchRequest()
do {
let messageSaved = try PersistenceServce.context.fetch(fetchRequest)
self.messageSaved = messageSaved
} catch let error as NSError {
print("Error: \(error.domain)")
}
}
@IBAction func onEditMessageTap(_ sender: Any) {
let alertController = UIAlertController(title: "Edit Preset Message", message: "Enter a new preset message", preferredStyle: .alert)
alertController.addTextField { textfield in
textfield.placeholder = "Your message..."
}
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
alertController.addAction(UIAlertAction(title: "Save", style: .default, handler: { action in
text = alertController.textFields!.first!.text!
let savedMessage = ClientData(context: PersistenceServce.context)
savedMessage.presetMessage = text
PersistenceServce.saveContext()
self.messageSaved.append(savedMessage)
return
}))
self.present(alertController, animated: true)
}
}
PersistenceServce
печатает SAVED
, когда alertController
заканчивается строкой, указывая, что он завершил свой процесс без ошибок.
Редактировать: Исходный код: https://github.com/SamuelMereau/coredata-error-reproduce