插入和更新核心数据对象的有效方法[2020]

当前,我正在基于id检查对象是否已存在于核心数据中,然后进行更新和插入。有什么更好的方法吗?添加了“ id”作为唯一约束,从而防止插入具有相同“ 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)
                }
            }
        }
    }

插入和更新核心数据对象的有效方法[2020]

iCMS 回答:插入和更新核心数据对象的有效方法[2020]

  1. 已添加“ id”作为唯一约束,从而防止插入具有相同“ id”的对象。
  • 我以前从未使用过
  1. 插入只是更新具有相同ID的现有对象吗?
  • 不,它将插入新对象。

对于您的情况,可以进行重构,请参考https://github.com/objcio/core-data/blob/master/SharedCode/Managed.swift中的findOrCreate函数

它将帮助您避免重复代码。

还有一件事,您的请求不需要sortDescriptor,并且它的限制应为1,优化的returnObjectAsFaults = false。

在那之后,您只需要确保在相同的上下文中调用函数即可避免重复。

本文链接:https://www.f2er.com/1802502.html

大家都在问