struct Game: Codable {
let id: String
var table = Table()
var players = [Player]()
var player1ID = ""
var player2ID = ""
var currentPlayerSetCountShouldAnimate = false
var opponentSetCountShouldAnimate = false
init(currentPlayer: Player) {
id = UUID().uuidString
players.append(currentPlayer)
players[0].playerNumber = 0
player1ID = currentPlayer.id
}
}
struct Player: Codable, Equatable {
var id = UUID().uuidString
var playerNumber = 0
var selectedCards: [Card]
var collectedSets: [Card]
var selectedCardsIndexes: [Int]
}
我将Game对象存储在Firestore数据库中,而不是在向selectedCards数组添加Card对象时更新整个游戏,我只想更新当前玩家的selectedCards数组。
func updatePlayerSelectedCards(player: Player) {
do {
let selectedCards = try JSONEncoder().encode(player.selectedCards)
let gameRef = Firestore.firestore().collection("Game").document(game.id)
let playerRef = gameRef.collection("players")
playerRef.document("\(player.playerNumber)").updateData(["selectedCards": selectedCards]) { (error) in
if let error = error {
print("Error updating selectedCards field: \(error)")
} else {
print("Successfully updated selectedCards field")
}
}
} catch {
print(error.localizedDescription)
}
}
我已经编写了很多关于这个函数的变体,但是当我试图访问players数组的playerNumber索引时,它给了我这个错误:
[FirebaseFirestore][I-FST 000001]写入数据流(7 f9 b27810 c 08)数据流错误:'未找到:没有要更新的文档:项目/设置游戏bc/数据库/(默认)/文档/游戏/FC 600 D8 C-85 DC-4465-8648- 31 FFA 90086 EB/玩家/0'
在所附的图片中,很明显,索引(在本例中为0)存在于播放器数组中。它不是一个文档吗?我需要使用FieldValue.arrayUnion吗?这是我的第一个“大型”项目,我觉得完成这个项目应该不难,所以我想我可能错过了一些简单的东西。任何帮助和澄清都将非常感谢。
1条答案
按热度按时间xeufq47z1#
问题从这里开始:
这段代码试图更新
players
集合中的$player.playerNumber
文档。但是您的屏幕截图显示players
字段在另一个命名的文档中。因此没有名为players
的文档,这解释了错误消息。在Firestore中没有方法操作符来更新数组字段中的项;唯一的操作符是添加唯一项、移除特定项或设置整个字段。
因此,如果
array_union
运算符对于您的用例来说不够好,您必须:1)读取数组,2)在应用程序代码中更新它,3)将整个数组写回数据库。另请参阅:Firestore Update single item in array of objects