Получение записи из CoreData в соответствии с авторизацией пользователя - PullRequest
0 голосов
/ 17 июня 2020

Пользователь может сохранять элементы в корзину, а затем он может просматривать корзину и видеть свои сохраненные элементы, но проблема в том, что когда я извлекаю данные записи из CoreData, я получаю все сохраненные пользователем элементы. Я написал условие для устранения этой проблемы, но получаю нулевую ошибку. Может ли кто-нибудь объяснить, почему это произошло и как это решить?

Объясняя проблему, например, у меня есть пользователь A и пользователь B, когда пользователь A сохранил некоторые товары в корзине, пользователь B получит эти товары в своей корзине а также

 func fetchRecordFromDatabase(){
        let userID = Auth.auth().currentUser?.uid

        let context = objAppDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Cart")

        do{
        result = try context.fetch(fetchRequest) as! [NSManagedObject]
            for data in result{
                if data == data{
                let obj = userNSObj()
                obj.itemName = data.value(forKey: "itemName") as! String
                obj.uid = data.value(forKey: "uid") as! String

                    if userID == obj.uid{
                        self.arrayAddress.append(obj)
                                  }
                         }else{
                            print("alert")
                        }}

                 }catch{
                      print("Failed")
                 }

             }

1 Ответ

0 голосов
/ 17 июня 2020

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

func fetchRecordFromDatabase(){
    guard let userID = Auth.auth().currentUser?.uid else { print("Invalid user ID"); return }

    let context = objAppDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<Cart>(entityName: "Cart")
    fetchRequest.predicate = NSPredicate(format: "uid == %@", userID)

    do {
        let carts = try context.fetch(fetchRequest)
        for cart in carts {
            let obj = userNSObj()
            obj.itemName = cart.itemName
            obj.uid = cart.uid
            self.arrayAddress.append(obj)
        }
    } catch {
        print(error)
    }
}

Примечание:

Я понятия не имею, что делает userNSObj. Если вы укажете общий c тип для FetchRequest (как уже предлагалось в одном из ваших предыдущих вопросов), вы получите Cart элементов без приведения типов. И настоятельно рекомендуется использовать точечную нотацию типа безопасного data.uid вместо ненадежного KV C data.value(forKey: "uid") as! String.

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