我有一个将分数对象保存到 Firebase 实时数据库的应用程序。然后,下载该应用程序的任何人都可以检索所述项目。
我正在使用空间来自动生成分数的 ID。但是,一旦我添加了云服务,这种方法就会失败,因为不同设备的房间会生成相同的 ID,并且当从 firebase 下载到我的房间缓存中时,它们会发生冲突并相互覆盖。
为了解决这个问题,我打算使用 firebase 创建 ID,这样所有 ID 都可以来自同一个来源,因此不应该发生冲突。
我在这里找到了几篇文章,详细介绍了如何使用 firebase 数据库从推送事务中获取密钥。我可以获取密钥并将其设置为分数项目,然后再将其存储在 firebase 上,但是,当我尝试使其以这种方式工作时,我每次都会收到相同的推送密钥,从而重复我必须开始的相同问题。
private fun saveScore(score: Score) {
viewModelScope.launch(Dispatchers.IO) {
// Write a message to the database
val database =
FirebaseDatabase.getInstance("https://winetraining-d6390-default-rtdb.firebaseio.com/")
val firebaseRef = database.getReference("Scores")
val newPostRef = firebaseRef.push()
val key = newPostRef.key
if (key != null) {
score.id = key
}
firebaseRef.setValue(score)
}
}
@Entity(tableName = "table_score")
data class Score(
@PrimaryKey
var id: String = "",
@ColumnInfo(name = "name")
var name: String,
@ColumnInfo(name = "score")
var score: Int,
@ColumnInfo(name = "type")
var type: Int
) {
override fun toString(): String {
return "Score{" +
"score=" + score +
", name='" + name + '\'' +
", type=" + type +
'}'
}
constructor() : this("","test-player",0, -1)
}