【问题标题】:How to store an array of objects in Firestore如何在 Firestore 中存储对象数组
【发布时间】:2019-03-08 18:29:53
【问题描述】:

我在网上找不到如何存储对象数组,以便键“line_items”为每个 menuItem 提供数字,每个 menuItem 的值对应于它自己的数字。换句话说,我需要将数字放在 line_items 之后而不是嵌套键之后,以便可以快速引用每个单独的 MenuItem 对象。我在网上找到了如何制作它,所以每个键都有一个值数组,但我需要 line_items 有一个 MenuItem 对象数组。以下代码崩溃:

public func uploadTransactionData(_ menuItems: [MenuItem], balanceId: String, subTotal: Int, completion: @escaping (() -> ())) {
    guard let userId = Auth.auth().currentUser?.uid else { completion(); return }
    let utilitiesManager = UtilitiesManager()
    let timestamp = utilitiesManager.timestamp()
    let params: [String: Any] = ["date": "\(timestamp)",
        "balance_id": "\(balanceId)",
        "subtotal": "\(subTotal)",
        "user_id": "\(userId)",
        "line_items": menuItems
    ]
    Firestore.firestore().document("transaction_history/\(timestamp)").setData(params)
    { err in
        if let e = err {
            print("$-- error creating user \(e)")
            completion()
        } else {
            completion()
        }
    }
}

这是 MenuItem 模型:

struct MenuItem {

let itemId: String
let name: String
var modifiers: [String]?
var photoName: String?
var photoUrl: String?
var quantity: Int
var price: Int
var sizeAddOnPrice: Int
var toppingsAddOnPrice: Int
let description: String
var size: String
let category: String

init(itemId: String, name: String, modifiers: [String]?, photoName: String?, photoUrl: String?, quantity: Int, price: Int, sizeAddOnPrice: Int, toppingsAddOnPrice: Int, description: String, size: String, category: String) {
    self.itemId = itemId
    self.name = name
    self.modifiers = modifiers
    self.photoName = photoName
    self.photoUrl = photoUrl
    self.quantity = quantity
    self.price = price
    self.sizeAddOnPrice = sizeAddOnPrice
    self.toppingsAddOnPrice = toppingsAddOnPrice
    self.description = description
    self.size = size
    self.category = category
}

【问题讨论】:

  • 您能补充一下您遇到的错误吗?
  • *** 由于未捕获的异常“FIRInvalidArgumentException”而终止应用程序,原因:“不支持的类型:_SwiftValue”
  • Firestore 永远不会知道 menuItem 是什么。请看这里:firebase.google.com/docs/firestore/manage-data/data-types 这些是 Firestore 支持的数据类型。

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

问题:

您的应用程序崩溃了,因为您试图将用户定义的对象 MenuItem 保存到 Firestore。 Firestore 不允许这样做。 Firestore 仅支持 this 数据类型。

解决方案:

您可以将自定义对象 MenuItem 转换为 Firestore 支持的数据类型。 您可以通过对代码进行以下更改来做到这一点。

  1. 使MenuItem确认Codable协议。

    struct MenuItem: Codable { 
         // Your code as it is.
    }
    
  2. 对您的 uploadTransactionData() 函数进行以下更改:

    public func uploadTransactionData(_ menuItems: [MenuItem], balanceId: String, subTotal: Int, completion: @escaping (() -> ())) {
    let userId = Auth.auth().currentUser?.uid else { completion(); return }
    let utilitiesManager = UtilitiesManager()
    let timestamp =  utilitiesManager.timestamp()
    
    var list_menuItem = [Any]()
    for item in menuItems {
        do {
            let jsonData = try JSONEncoder().encode(item)
            let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: [])
            list_menuItem.append(jsonObject)
        }
        catch {
            // handle error
        }
    }
    
    let params: [String: Any] = ["date": "\(timestamp)",
        "balance_id": "\(balanceId)",
        "subtotal": "\(subTotal)",
        "user_id": "\(userId)",
        "line_items": list_menuItem
    ]
    
    
    Firestore.firestore().document("transaction_history/\(timestamp)").setData(params) 
        { err in
            if let e = err {
                print("$-- error creating user \(e)")
                completion()
            } else {
                completion()
            }
        }
    }
    

【讨论】:

    【解决方案2】:

    这是因为 Firestore 不知道如何保存值:menuItems

    you can map it like this: "objectExample": [
        "a": 5,
        "b": [
            "nested": "foo"
        ]
    ]
    

    或:

    .setData([
    "name": "Frank",
    "favorites": [ "food": "Pizza", "color": "Blue", "subject": "recess" ],
    "age": 12
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多