Как заменить / обновить данные, сохраняемые в основных данных - PullRequest
0 голосов
/ 06 января 2019

Я сохранил данные JSON в основных данных. Проблема для моего приложения заключается в том, что всякий раз, когда я снова вызываю api, вызываемые и сохраняемые данные добавляются в новую строку в основных данных. Я хочу, чтобы всякий раз, когда я снова вызывал API, данные, которые были до этого, заменялись или обновлялись. Как мне этого добиться? Я прочитал его, я могу использовать NSBatchUpdateRequest , но я все еще не понимаю, как это реализовать.

Это мой код

ApiSession.shared.send(request) { (response) in
        if let err = response.error {
            print("Failed to get youtube data:", err)
            return
        }

        guard let results = response.value else { return }
        self.nextPageToken = results.nextPageToken
        results.items.forEach({ (result) in
            let context = CoreDataManager.shared.persistenceContainer.viewContext
            if let video = NSEntityDescription.insertNewObject(forEntityName: "Video", into: context) as? Video {
                video.videoTitle = result.snippet.title
                video.videoId = result.id.videoID
            }

            let request: NSFetchRequest<Video> = Video.fetchRequest()

            do {
                try context.save()
                let videos = try context.fetch(request)

                DispatchQueue.main.async {
                    self.videos = videos
                    self.tableView.reloadData()
                }
            } catch let saveErr {
                print("Failed to save video:", saveErr)
            }
        })
    }

Ответы [ 2 ]

0 голосов
/ 06 января 2019

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

Если он существует, обновите его.
Если нет, создайте новый.

ApiSession.shared.send(request) { response in
    if let err = response.error {
        print("Failed to get youtube data:", err)
        return
    }

    guard let results = response.value else { return }
    self.nextPageToken = results.nextPageToken
    let context = CoreDataManager.shared.persistenceContainer.viewContext
    results.items.forEach({ result in
        let request: NSFetchRequest<Video> = Video.fetchRequest()
        request.predicate = NSPredicate(format: "videoId == %@", result.id.videoID) // if videoID is Int change the placeholder to `%ld`
        do {
            let videos = try context.fetch(request)
            if let video = videos.first {
                video.videoTitle = result.snippet.title
                self.videos.append(video)
            } else {
                let video = NSEntityDescription.insertNewObject(forEntityName: "Video", into: context) as! Video
                video.videoTitle = result.snippet.title
                video.videoId = result.id.videoID
            }
        } catch {
            print("Failed to fetch video:", error)
        }
    })
    do {
       try context.save()
    } catch {
       print("Failed to save video:", error)
    }
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}
0 голосов
/ 06 января 2019

Попробуйте что-то вроде этого:

    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "Video")
    fetchRequest.predicate = NSPredicate(format: "videoId = %@", result.id.videoID)
    var videoList: [NSManagedObject] = []
    var video: Video
    do {
        videoList = try context.fetch(fetchRequest)
    }
    catch {
        print("error executing fetch request: \(error)")
    }

    if videoList.count > 0 {
        video = videoList[0] as! Video
    } else {
        video = NSEntityDescription.insertNewObject(forEntityName: "Video", into: context) as? Video
        video.videoId = result.id.videoID
    }

    if let v = video {
        v.videoTitle = result.snippet.title
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...