#swift #core-data
#swift #core-data
Вопрос:
Пользователь сможет добавить товар в корзину, поэтому, когда он добавит один товар, я хочу, чтобы он не мог добавить его снова, чтобы избежать дублирования. Вот код, в котором я отправляю данные в coredata после добавления пользователем товара в корзину.
@IBAction func btnBuy(_ sender: UIButton) {
let context = objAppDelegate.persistentContainer.viewContext
let tblCart = NSEntityDescription.insertNewObject(forEntityName: "Cart", into: context)
do {
tblCart.setValue(lblProductName.text!, forKey: "name")
tblCart.setValue(Int(lblQty.text!), forKey: "quantity")
tblCart.setValue(id, forKey: "id")
tblCart.setValue(uid, forKey: "uid")
// there is more
try context.save()
print("data Saved")
} catch{
print("error in database")
}
}
Я извлек данные двух элементов одного и того же продукта, посмотрите, как это выглядит
(lldb) po data
<Cart: 0x6000025cdc70> (entity: Cart; id: 0x8ebb1a1397c1bf8e <x-coredata://E72A6C76-3400-44A8-9FA6-61AA874CEF9B/Cart/p2>; data: {
category = Metalwork;
id = "-MEbK8UfDQdweqaUc2Cb";
itemType = Product;
name = "Omani Dagger";
price = 320;
quantity = 4;
sellerID = "-M9Dp5GFFTt9bdqtpjrw";
stoke = 1;
totalPrice = 0;
uid = ZwTXwUWPmzfY6Pgc1S2gpMZu9x72;
})
(lldb) po data
<Cart: 0x6000025cdc20> (entity: Cart; id: 0x8ebb1a1397c5bf8e <x-coredata://E72A6C76-3400-44A8-9FA6-61AA874CEF9B/Cart/p3>; data: {
category = Metalwork;
id = "-MEbK8UfDQdweqaUc2Cb";
itemType = Product;
name = "Omani Dagger";
price = 320;
quantity = 4;
sellerID = "-M9Dp5GFFTt9bdqtpjrw";
stoke = 1;
totalPrice = 0;
uid = ZwTXwUWPmzfY6Pgc1S2gpMZu9x72;
})
Теперь, как я смогу избежать дублирования одного и того же продукта
Комментарии:
1. Обычным решением для этого является сначала выполнить запрос на выборку, а в случае успеха затем обновить выбранный объект, иначе создать новый, но поскольку ваши 2 объекта точно такие же, мне кажется, что у вас есть какая-то другая проблема, поскольку вы сохраняете одни и те же данные дважды.
2. @JoakimDanielson не могли бы вы объяснить, как обновить выбранный объект, потому что я перепробовал много решений и не смог его решить.
Ответ №1:
Каждый раз, когда вы нажимаете кнопку купить, вы создаете новый Cart
экземпляр с NSEntityDescription.insertNewObject(forEntityName:into:)
помощью.
Чтобы устранить ваши дублирующиеся корзины, вам сначала нужно определить, Cart
существует ли уже. Вы можете использовать NSFetchRequest
на NSManagedObjectContext
для извлечения существующей корзины.
let fetch = Cart.fetchRequest() as! NSFetchRequest<Cart>
fetch.predicate = NSPredicate(format: "%K == %@", #keyPath(Cart.id), "EXISTING ID TO LOCATE")
if let cart = try context.fetch(fetch).first {
// update cart
} else {
// create cart
}