是否可以通过传入一个对象来简单地更新 Firestore 对象,并让它找出具体要更新的内容?

Posted

技术标签:

【中文标题】是否可以通过传入一个对象来简单地更新 Firestore 对象,并让它找出具体要更新的内容?【英文标题】:Is it possible to simply update Firestore object by passing in an object, and letting it figure out what to update specifically? 【发布时间】:2022-01-20 02:11:22 【问题描述】:

我设计了我的代码,以便对我的 api 服务隐藏 Firebase(例如,CurrentUserAPIService),因此如果我想更新用户对象,我想执行以下操作:

// CurrentUserAPIService.swift
func updateCurrentUser(with currentUser: CurrentUser, completionHandler: @escaping (Result<CurrentUser, APIError>) -> Void) 
        myAPI.updateObject(object: currentUser, withId: currentUser.id, atPath: .users)  result in
            switch result 
            case .success:
                print("Success")
                completionHandler(.success(currentUser))

            case .failure(let error):
                print("Error: \(error.localizedDescription)")
                completionHandler(.failure(error))
            
        
    

它将调用我的 API 类来执行以下操作:

// MyAPI.swift
func updateObject<T: Encodable>(object: T, withId objectId: String, atPath path: Path, completionHandler: @escaping (Result<Void, APIError>) -> Void) 
        let documentReference = Firestore.firestore().collection(path.rawValue).document(objectId)

        do 
            try documentReference.updateData(object, completion:  error in
                if let error = error 
                    print("Error: \(error.localizedDescription)")
                    completionHandler(.failure(.generic(message: error.localizedDescription)))
                 else 
                    completionHandler(.success(()))
                
            )

         catch 
            print("Error: \(error.localizedDescription)")
            completionHandler(.failure(.generic(message: error.localizedDescription)))
        
    

这可能吗?如果可能的话,我想要一种方法来传递完整的对象并有一个帮助函数来确定实际自动上传的内容。

【问题讨论】:

【参考方案1】:

如果你真的需要使用 updateData 语法,你应该在setData() 周围写一个包装器。 Firestore 无法知道您要更新什么。 merge:true 将确保本地副本上的任何字段覆盖数据库副本。它不会从数据库中删除任何字段。

extension DocumentReference 
    func updateData<T: Encodable>(for object: T, completion: @escaping (Error?) -> Void) 
        do 
            try self.setData(from: object, merge: true)  err in
                completion(err)
            
         catch 
            completion(error)
        
    

【讨论】:

以上是关于是否可以通过传入一个对象来简单地更新 Firestore 对象,并让它找出具体要更新的内容?的主要内容,如果未能解决你的问题,请参考以下文章

在 FaunaDB 中更新记录时,如何在不传入每个字段和子对象的情况下更新一个字段?

如何根据传入参数的值有条件地应用 GraphQL 过滤器?

Spring中的设计模式

Spring中的设计模式

Spring中用到的设计模式

Java程序员春招三面蚂蚁金服,java反射获取枚举对象