Как избежать добавления той же модели данных, которая имеет тот же первичный ключ в базе данных области? - PullRequest
0 голосов
/ 29 ноября 2018

enter image description here

У меня есть отношения один ко многим между двумя моделями, Product и WishList, как в коде ниже

class Product : Object {

    @objc dynamic var productID : String = ""
    @objc dynamic var name : String = ""
    @objc dynamic var unitPrice: Double = 0.0
    @objc dynamic var imagePath : String = ""
    @objc dynamic var quantity = 0
    @objc dynamic var hasBeenAddedToWishList : Bool = false
    var parentCategory = LinkingObjects(fromType: WishList.self, property: "products")

    convenience init(productID : String, name: String, unitPrice: Double, imagePath: String, quantity: Int = 1, hasBeenAddedToWishList: Bool = false) {
        self.init()

        self.productID = productID
        self.name = name
        self.unitPrice = unitPrice
        self.imagePath = imagePath
        self.quantity = quantity
        self.hasBeenAddedToWishList = hasBeenAddedToWishList
    }

    override static func primaryKey() -> String? {
        return "productID"
    }

}

и WishList:

class WishList : Object {
    @objc dynamic var userID: String = ""
    var products = List<Product>()
}

Я пытаюсь добавить или удалить товар в WishList, используя код ниже, когда нажата кнопка «Любовь» на изображении выше:

    // 1. get the wishlist based on UserID

    let allWishList = realm.objects(WishList.self)
    let theWishList = allWishList.filter("userID CONTAINS[cd] %@", userID).first

    guard let userWishList = theWishList else {return}


    // 2. modify Wishlist data in Realm.

    if loveIconHasBeenFilled {

       guard let index = userWishList.products.index(where: {$0.productID == selectedProduct.productID}) else {return}

       do {
        // remove data from realm database            

          try realm.write {
            userWishList.products.remove(at: index)
          }

        } catch {
          // error Handling
        }



    } else {

      do {

         // add product to wishlist model in realm database

         try realm.write {
            userWishList.products.append(selectedProduct)
         }

      } catch {
        // error Handling
      }


   }

и вот данные в Realm Browserenter image description here

enter image description here

, и проблема заключается в том, что ....

при запуске приложения дляв первый раз я могу добавить, а затем удалить, а затем снова добавить продукт в список пожеланий, и номер продукта в базе данных области останется прежним (все имеют уникальный productID)

, но когда яперезапустите приложение и попробуйте нажать эту кнопку «любовь», чтобы снова добавить продукт в список желаний. Выдается ошибка

«RLMException», причина: «Попытка создать объект типа« Продукт »с помощьюсуществующее значение первичного ключа 'a'

эта ошибка вызвана из-за этой строки кода userWishList.products.append(selectedProduct),при добавлении продукта в WishList он автоматически добавляет Product в базу данных области.поэтому, поскольку я продолжаю добавлять один и тот же продукт, который имеет один и тот же productID (первичный ключ), он выдаст эту ошибку.

поэтому мой вопрос состоит в том, как избежать добавления в Product, если он имеет тот же productID (первичный ключ), было бы лучше, если бы я мог просто обновить продукт в базе данных области при добавлении продукта в список желаний, используя следующую строку кода: userWishList.products.append(selectedProduct)

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете проверить свойство hasBeenAddedToWishList выбранного продукта и добавить его, только если свойство имеет значение false.

 if loveIconHasBeenFilled {
   //your logic to remove already added products

} else if !selectedProduct.hasBeenAddedToWishList { //<--- check if the product already exists in wishlist if not you add it

  do {

     // add product to wishlist model in realm database

     try realm.write {
        userWishList.products.append(selectedProduct)
     }

  } catch {
    // error Handling
  }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...