Как избежать добавления одного и того же элемента в CoreData с помощью swift?

#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
}
  

Ответ №2:

Вы можете добавить уникальные ограничения к моделям (таблица ограничений)

введите описание изображения здесь

Затем вы можете изменить политику слияния, определив, как CoreData должна обрабатывать конфликты

   self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy