Я пытаюсь построить корзину с базовыми данными. Я создал 3 объекта для моделирования моих данных Product, Quantity и CartItem, в которых содержится продукт и количество, и я сохраняю их как преобразовываемый объект в базовых данных.
Я создал класс для моего xcdatamodeld с атрибутом CartItem
@objc(CartItemContainer)
class CartItemContainer: NSManagedObject {
@NSManaged var cartItemAttribute: CartItem
}
Я сохраняю основные данные без проблем, но всякий раз, когда я пытаюсь обновить количество с помощью приведенного ниже кода, оно не изменяется, оно все равно будет равно 1.
static func changeQuantity(product: Product) {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<CartItemContainer>(entityName: "CartItemContainer")
var results: [CartItemContainer] = []
do {
results = try context.fetch(fetchRequest)
if let productToChangeQuantityOn = results.first(where: {$0.cartItemAttribute.product.productID == product.productID}) {
let oldQuantity = productToChangeQuantityOn.cartItemAttribute.quantity.value
productToChangeQuantityOn.cartItemAttribute.quantity.value = oldQuantity + 1
try context.save()
context.refresh(productToChangeQuantityOn, mergeChanges: false)
}
}
catch {
print("error executing fetch request: \(error)")
}
}
Я попытался обновить его без вызова context.refresh(productToChangeQuantityOn, mergeChanges: false)
это изменило бы количество во время выполнения, но при перезапуске приложения количество все равно будет равно 1.
Что мне здесь не хватает?
Буду признателен за любую помощь.
Обновление:
Вот как я настроил продукт, например. Количество и CartItem имеют одинаковые настройки.
class Product: NSObject, NSCoding, Decodable {
let productID: String
let category: String
let images: Dictionary<String, String>
let name: Dictionary<String, String>
let price: Dictionary<String, String>
func encode(with aCoder: NSCoder) {
aCoder.encode(productID, forKey: "productID")
aCoder.encode(category, forKey: "category")
aCoder.encode(images, forKey: "images")
aCoder.encode(name, forKey: "name")
aCoder.encode(price, forKey: "price")
}
required init?(coder aDecoder: NSCoder) {
self.productID = aDecoder.decodeObject(forKey: "productID") as! String
self.category = aDecoder.decodeObject(forKey:"category") as! String
self.images = aDecoder.decodeObject(forKey: "images") as! Dictionary<String, String>
self.name = aDecoder.decodeObject(forKey: "name") as! Dictionary<String, String>
self.price = aDecoder.decodeObject(forKey: "price") as! Dictionary<String, String>
}
}