使用 Firebase 更新数据模型

Posted

技术标签:

【中文标题】使用 Firebase 更新数据模型【英文标题】:Updating Data Model with Firebase 【发布时间】:2020-10-02 12:12:56 【问题描述】:

在视图加载时,我想根据 Firebase 实时数据库更新 ImageDataModel 的收藏值。

//ImageDataModel.swift

struct ImageDataModel 
    var image: String
    var title: String
    var favorite: String


extension ImageDataModel 
    static var data: [ImageDataModel] = [
        ImageDataModel(image: "image_1", title: "XXXXX", favorite: "N"),
        ImageDataModel(image: "image_2", title: "YYYYY", favorite: "N"),
        ImageDataModel(image: "image_3", title: "ZZZZZ", favorite: "N")
    ]

初始视图

struct ImageStepView: View 

var data: ImageDataModel
var ref: DatabaseReference = Database.database().reference()
var userID = UIDevice.current.identifierForVendor!.uuidString

var body: some View 
    
    VStack
        ...
    .onAppear  self.getFavoriteImages() 


func getFavoriteImages()
    
    ref.child("users").child(userID).observeSingleEvent(of: .value, with:  (snapshot) in
        let value = snapshot.value as? NSDictionary
        print("value::",value ?? "") // value:: "image_1" = "Y"; "image_3" = "Y";

        //Here I want to update the ImageDataModel 
        
    )  (error) in
        print(error.localizedDescription)
    
  

例如,如果 Firebase 返回值包含 "image_1" = "Y"; "image_3" = "Y";,那么我想像这样更新我的 ImageDataModel

extension ImageDataModel 
        static var data: [ImageDataModel] = [
            ImageDataModel(image: "image_1", title: "XXXXX", favorite: "Y"),
            ImageDataModel(image: "image_2", title: "YYYYY", favorite: "N"),
            ImageDataModel(image: "image_3", title: "ZZZZZ", favorite: "Y")
        ]
    

//Firebase 数据结构示例


  "A9E41390-7557-4FE3-A319-B4472048AF94" : 
    "image_1" : "Y",
    "image_3" : "Y"
  

我不确定这是否是最好的方法,但我非常感谢任何帮助。

【问题讨论】:

我不确定我是否理解您实现此功能的问题所在。但是,如果您编辑您的问题以在/users/$userID 显示 JSON(作为文本,请不要截图),这可能会有所帮助。您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。 感谢您的回答,我已经编辑了问题。我的实际需要是操纵ImageDataModel。例如更改 favorite 值。 【参考方案1】:

您似乎在每个用户 ID 下都有一个子节点列表。在这种情况下,您需要循环 snapshot.children 以将每个子节点作为 DataSnapshot

ref.child("users").child(userID).observeSingleEvent(of: .value, with:  (snapshot) in
    for child in snapshot.children.allObjects as! [DataSnapshot] 
        let childKey = child.key
        let childValue = child.value as! String

        let model = ImageDataModel(image: childKey, title: "???", favorite: childValue)

        ...
    
)  (error) in
    print(error.localizedDescription)

【讨论】:

我得到了我需要的所有数据,并在你的回答的帮助下构建了一个新的Data Model。问题是我无法更新现有的ImageDataModel 恐怕我不知道那是什么意思,所以无能为力。如果您在某处有一个现有的ImageDataModel 对象列表,则需要在那里找到相应的对象并更新它或将其替换为根据 Firebase 中的数据构建的新对象。但这听起来像是一个纯粹的 Swift 问题,而不是 Firebase 问题,所以我建议搜索“在 swift 中更新数组中的项目”以查看是否显示出良好的结果。 感谢您的宝贵时间。你的回答对我帮助很大。

以上是关于使用 Firebase 更新数据模型的主要内容,如果未能解决你的问题,请参考以下文章

更新 Firebase 实时数据库中的现有数据

在视图模型中使用 LiveData 的结果从 firebase 获取数据

在不使用数据库触发器的情况下,无法使用 firebase 云功能更新 firebase 数据库

Firebase与数据更新滞后 - 多人游戏

使用 Firebase 观察数据更新 UI (Swift)

如何使用 Cloud Functions for Firebase 更新 Firebase 实时数据库中的值