Эффективный способ вставки и обновления основного объекта данных [2020] - PullRequest
0 голосов
/ 05 августа 2020

В настоящее время я проверяю, существует ли уже объект в основных данных на основе идентификатора, а затем обновляю и вставляю. Есть ли лучший способ сделать это? Добавили «id» как уникальное ограничение, которое предотвращает вставку объектов с таким же «id». Обновляет ли вставка только существующий объект с тем же идентификатором?

   @nonobjc public class func saveUserMovies(movieJSON: [[String: Any]], user: UserProfile, isFavorites: Bool = false, isWatchlisted: Bool = false) {
        let context = MMPersistentStore.sharedInstance.privateManagedObjectContext
        for movie in movieJSON {
            let movieID = movie["id"] as! Int
            let fetchMovieWithIDRequest = fetchMovieRequest()
            let moviePredicate = NSPredicate(format: "id == %d", movieID)
            let sortDiscriptor = NSSortDescriptor(key: "id", ascending: false)
            fetchMovieWithIDRequest.sortDescriptors = [sortDiscriptor]
            fetchMovieWithIDRequest.predicate = moviePredicate
            
            var userMovie: UserMovie?
            context.performAndWait {
                do {
                    userMovie = try fetchMovieWithIDRequest.execute().first
                } catch {
                    print(MMErrorStrings.coreDataFetchError)
                }
                }
                if let fetchedMovie = userMovie {
                    fetchedMovie.genreIds = movie["genre_ids"] as? [Int64]
                    fetchedMovie.adult = movie["adult"] as? Bool ?? false
                    if isFavorites {
                      fetchedMovie.isFavorite = isFavorites
                    } else {
                        fetchedMovie.isWatchlisted = isWatchlisted
                    }
                    
                    fetchedMovie.video = movie["video"] as? Bool ?? false
                    fetchedMovie.backdropPath = movie["backdrop_path"] as? String
                    fetchedMovie.originalLanguage = movie["original_language"] as? String
                    fetchedMovie.originalTitle = movie["original_title"] as? String
                    fetchedMovie.overview = movie["overview"] as? String
                    fetchedMovie.posterPath = movie["poster_path"] as? String
                    fetchedMovie.releaseDate = movie["release_date"] as? String
                    fetchedMovie.releaseYear = String(fetchedMovie.releaseDate?.prefix(4) ?? "")
                    fetchedMovie.title = movie["title"] as? String
                    fetchedMovie.popularity = movie["popularity"] as? Double ?? 0.0
                    fetchedMovie.voteCount = movie["voteCount"] as? Int64 ?? 0
                    fetchedMovie.voteAverage = movie["voteAverage"] as? Double ?? 0.0
                    
                    MMPersistentStore.sharedInstance.save(context: context)
                } else {
                    let fetchedMovie = UserMovie(context: context)
                    fetchedMovie.id = movie["id"] as? Int64 ?? 0
                    fetchedMovie.user = user
                    fetchedMovie.genreIds = movie["genre_ids"] as? [Int64]
                    fetchedMovie.adult = movie["adult"] as? Bool ?? false
                    if isFavorites {
                      fetchedMovie.isFavorite = isFavorites
                    } else {
                        fetchedMovie.isWatchlisted = isWatchlisted
                    }
                    
                    fetchedMovie.video = movie["video"] as? Bool ?? false
                    fetchedMovie.backdropPath = movie["backdrop_path"] as? String
                    fetchedMovie.originalLanguage = movie["original_language"] as? String
                    fetchedMovie.originalTitle = movie["original_title"] as? String
                    fetchedMovie.overview = movie["overview"] as? String
                    fetchedMovie.posterPath = movie["poster_path"] as? String
                    fetchedMovie.releaseDate = movie["release_date"] as? String
                    fetchedMovie.releaseYear = String(fetchedMovie.releaseDate?.prefix(4) ?? "")
                    fetchedMovie.title = movie["title"] as? String
                    fetchedMovie.popularity = movie["popularity"] as? Double ?? 0.0
                    fetchedMovie.voteCount = movie["voteCount"] as? Int64 ?? 0
                    fetchedMovie.voteAverage = movie["voteAverage"] as? Double ?? 0.0
                    
                    MMPersistentStore.sharedInstance.save(context: context)
                }
            }
        }
    }

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

1 Ответ

0 голосов
/ 05 августа 2020
  1. Добавлен «id» как уникальное ограничение, которое предотвращает вставку объектов с тем же «id».
  • Я еще не использовал его раньше
Обновляет ли вставка только существующий объект с тем же идентификатором?
  • Нет, будет вставлен новый объект.

В вашем случае вы может выполнить рефакторинг, обратитесь к функции findOrCreate в https://github.com/objcio/core-data/blob/master/SharedCode/Managed.swift

Это поможет вам избежать дублирования кода.

Еще одна вещь, ваш запрос не Мне не нужен sortDescriptor, и он должен иметь limit = 1 и returnObjectAsFaults = false для оптимизации.

После этого вам просто нужно убедиться, что ваша функция вызывается в том же контексте, чтобы избежать дублирования.

...