Как сохранить массив объектов в Firestore - PullRequest
0 голосов
/ 08 марта 2019

Я не могу найти в Интернете, как сохранить массив объектов так, чтобы ключ "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
}

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Проблема:

Ваше приложение падает, потому что вы пытаетесь сохранить пользовательский объект MenuItem в Firestore.Firestore не позволяет этого.Firestore поддерживает только этот типы данных.

Решение:

Вы можете преобразовать свой пользовательский объект 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()
            }
        }
    }
    
0 голосов
/ 08 марта 2019

Это потому, что 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
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...