Функция не возвращается, если в CoreData Swift уже существует запись - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть эта функция, которая вызывается firebase .childAdded observer, и я пытаюсь проверить, находится ли запись для записи в базе данных, прежде чем она записывает ее. Это связано с тем, что когда пользователь входит в систему, все входящие моментальные снимки вызывают многократную запись в базу данных. Я пытаюсь выполнить проверку с помощью .contains bool против записи, если это произойдет, то функция должна вернуться, иначе она будет продолжать и записывать новую запись, но не работает, при каждом входе в систему она будет добавлять все входящие снимки. Что я должен сделать вместо этого? Большое спасибо как всегда. Это функция:

static func saveBooking(bookingId: String, bookingDate: String, bookingStart: String, bookingEnd: String, customerName: String, price: String, workList: String) throws {
        let context = CoreData.databaseContext

        let request: NSFetchRequest<User> = User.fetchRequest()
        do {
            let fetch = try context.fetch(request)
            print("@@@@@@@@@@@@@@@@@@       fetching user")

            for value in fetch {
                if value.name == UserDetails.fullName {
                    print("User is: \(value.name!)")  //correct


                    if #available(iOS 10.0, *) {
                        let booking = Booking(context: context)
                        booking.user?.name = value.name!

                        booking.bookingId = bookingId
                        booking.bookingDate = bookingDate
                        booking.bookingStart = bookingStart
                        booking.bookingEnd = bookingEnd
                        booking.customerName = customerName
                        booking.bookingPrice = price
                        booking.worksList = workList
                        if value.bookings!.contains(booking){
                            print("@@@@@@@@@   found existing record for this booking! ")
                            return

                        } else {
                            value.addToBookings(booking)
                            print("@@@@@@@@@@@@@@@@@@@@@@@@@  booking user at propertis value attribution is : \(String(describing: booking.user!.name!))")
                            do {
                                try context.save()
                                print("@@@@@@@@@@@@@@@@@@@@@@@@@  booking user after saving booking is : \(String(describing: booking.user!.name!))")
                                print("@@@@@@@@@@@@    New booking is saved")
                            } catch  {
                                print("@@@@@@@@@@@@@@    Error saving new booking")
                                print(error)
                            }
                        }

                    } else {
                        // Fallback on earlier versions
                        let entityDescription = NSEntityDescription.entity(forEntityName: "Booking", in: context)
                        let booking = Booking(entity: entityDescription!, insertInto: context)
                        booking.user?.name = value.name
                        booking.bookingId = bookingId
                        booking.bookingDate = bookingDate
                        booking.bookingStart = bookingStart
                        booking.bookingEnd = bookingEnd
                        booking.customerName = customerName
                        booking.bookingPrice = price
                        booking.worksList = workList
                        if value.bookings!.contains(booking) {
                            print("@@@@@@@@@   found existing record for this booking! ")
                            return
                        } else {
                            value.addToBookings(booking)
                            do {
                                try context.save()
                                print("@@@@@@@@@@@@    New booking is saved")
                            } catch  {
                                print("@@@@@@@@@@@@@@    Error saving new booking")
                                print(error)
                            }
                        }
                    }
                }
            }
        } catch  {
            print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      Error in fetching a user")
        }
    }

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

строка let booking = Booking(context: context) создает новый Booking и вставляет его в контекст.Это всегда происходит (как и до вашего состояния).Этот недавно созданный Booking НИКОГДА не является частью набора value.booking - (как это могло быть, просто он был создан!) - поэтому он всегда добавляется.

Я думаю, что вместо этого вы хотите

if value.bookings!.contains{ $0.bookingId == bookingId) {
    let booking = Booking(context: context)
    value.addToBookings(booking)
    booking.user?.name = value.name!
    ....
0 голосов
/ 08 апреля 2019

Я закончил проверку существующей записи более классическим способом, используя NSFetchRequest<NSFetchResult> и NSPredicate, но я хотел бы понять, как использовать и исследовать решение, предложенное Джоном Роузом, которое на самом деле было очень полезным так как я не осознавал, что все равно создаю новый объект.
Я надеюсь, что это поможет другим. Таким образом, функция теперь записывается как:

static func saveBooking(bookingId: String, bookingDate: String, bookingStart: String, bookingEnd: String, customerName: String, price: String, workList: String) throws {
        let context = CoreData.databaseContext
        let request: NSFetchRequest<User> = User.fetchRequest()
        do {
            let fetch = try context.fetch(request)
            print("@@@@@@@@@@@@@@@@@@       fetching user")
            for userValue in fetch {
                if userValue.name == UserDetails.fullName {
                    print("User is: \(userValue.name!)")  //correct

                    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Booking")
                    let predicate = NSPredicate(format: "bookingId == %@", bookingId)
                    request.predicate = predicate
                    request.fetchLimit = 1

                    do{
                        let count = try context.count(for: request)
                        if(count > 0){
                            //  matching object
                            print("@@@@@@@@@@@@ booking is already recorded")
                            return
                        }
                        else{
                            print("@@@@@@@@@@@@    booking is new")
                            if #available(iOS 10.0, *) {
                                let booking = Booking(context: context)
                                booking.user?.name = userValue.name!
                                booking.bookingId = bookingId
                                booking.bookingDate = bookingDate
                                booking.bookingStart = bookingStart
                                booking.bookingEnd = bookingEnd
                                booking.customerName = customerName
                                booking.bookingPrice = price
                                booking.worksList = workList
                                userValue.addToBookings(booking)
                            } else {
                                // Fallback on earlier versions
                                let entityDescription = NSEntityDescription.entity(forEntityName: "Booking", in: context)
                                let booking = Booking(entity: entityDescription!, insertInto: context)
                                booking.user?.name = userValue.name!
                                booking.bookingId = bookingId
                                booking.bookingDate = bookingDate
                                booking.bookingStart = bookingStart
                                booking.bookingEnd = bookingEnd
                                booking.customerName = customerName
                                booking.bookingPrice = price
                                booking.worksList = workList
                                userValue.addToBookings(booking)

                            }
                        }
                    }
                }
            }

            do {
                try context.save()
                print("@@@@@@@@@@@@    New booking is saved")
            } catch  {
                print("@@@@@@@@@@@@@@    Error saving new booking")
                print(error)
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...