【问题标题】:Swift reading data in Firebase realtime database快速读取 Firebase 实时数据库中的数据
【发布时间】:2017-01-18 19:13:53
【问题描述】:

我在我的应用上设置了条码扫描器,当应用扫描了条码后,我希望它搜索我的 Firebase 数据库,看看它之前是否被扫描过。

这是我的 Firebase 数据库 JSON:

{
  "Ingredients" : {
    "Pork" : {
      "Products" : {
        "5741000124024" : {
          "Amount" : "1",
          "Unit" : "kg"
        }
      }
    },
    "apple" : {
      "Products" : {
        "5826374655024" : {
          "Amount" : "200",
          "Unit" : "g"
        }
      }
    }
  }
}

5741000124024 是我试图通过此代码查找的产品的条形码:

FIRDatabase.database().reference().child("Ingredients").queryEqual(toValue: code).observeSingleEvent(of: .value, with: { (snap) in

    if !snap.exists() {
        print("Not scanned before")
    } else {
        print("Found It")
    }

})

它一直打印Not scanned before,即使条形码匹配,我在这里做错了什么?

【问题讨论】:

    标签: ios json swift firebase firebase-realtime-database


    【解决方案1】:

    改变你的结构以匹配你正在做的事情。

    Ingredients
       -Uiiais9jjasd
         type: -Yss9ks9slkls
         barcode: "009012398129"
         amount: "1"
         unit: "kg"
       -Yijaijisdja
         type: -Y89u9s9asdsd
         barcode: "099009298493"
         amount: "1"
         unit: "kg"
       -Ua9j9jisjijd
         type: -Y89u9s9asdsd
         barcode: "000192983982"
         amount: "22"
         unit: "kg"
    
    Types
       -Y89u9s9asdsd
         type: "Pork"
       -Yss9ks9slkls
         type: "Apple"
    

    节点键名(-Uiiais9jjasd、-Yijaijisdja)是使用 childByAutoId 创建的,因为通常最好的做法是取消键名与子数据的关联。

    【讨论】:

    • 我不能那样做,因为猪肉有不同的种类,有 2kg 的包装和 0.5kg 的包装等等,它们都有不同的条形码,所以它需要这样构造
    • @Benja0906 明白了。我更新了答案以适应所有成分和所有类型(猪肉、苹果等)
    【解决方案2】:

    如果您的现有节点很难从中提取一些数据,请创建一个新节点/分支以便轻松获取数据,如下所示:

    {
      "Barcode-Products" : {
        "5826374655024" : {
          "parent-item-id" : "apple"
        }
      },
      "Ingredients" : {
        "Pork" : {
          "Products" : {
            "5741000124024" : {
              "Amount" : "1",
              "Unit" : "kg"
            }
          }
        },
        "apple" : {
          "Products" : {
            "5826374655024" : {
              "Amount" : "200",
              "Unit" : "g"
            }
          }
        }
      }
    }
    

    这是我使用在线编辑器制作的这个 JSON 的链接: http://www.jsoneditoronline.org/?id=ad884a350ce65b1580e090eb044002b1

    这是您想在 NoSQL / Firebase 中使用的一种技术。在这种情况下,您可以轻松地使用 Firebase SDK 的 queryEqual to 函数来获取特定的 Barcode Id。然后查找它的 parent-item-id

    【讨论】:

    • 虽然从表面上看这个结构看起来不错,但它很难维护。它需要去规范化,并且在 apple 下有一个子节点 Products 是相反的——apple 是一种产品,而不是相反。最大的问题是将密钥与其包含的数据解除关联。这个答案不起作用,因为父项 ID“Apple”不会匹配“apple”。是的 - 这是一个错字,但突出了一个基本问题;如果您想要 使用Apple 而不是Apple 怎么办?整个结构中对苹果的每个引用都必须更新。使用 childByAutoId 键可以完全避免这种情况。
    • 嗨,Jay,是的,这是一个错字。我在工作时正在做这个答案。当然,key/id 应该来自 childByAutoId。是的,你是对的,整个数据库中的每个引用都应该更新。
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多