1

我有一个将分数对象保存到 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)
}
4

1 回答 1

1

当您生成密钥时,您需要使用为该密钥设置一些值setValue()

 val newPostRef = firebaseRef.push()
 newPostRef.setValue(someValue) // set some value to the key

请注意,任何 firebase 节点都应该是键/值对;没有价值的钥匙不会独立存在。

您会注意到,如果您尝试在 firebase 控制台上手动添加一些键,除非您设置相应的值,否则它不会被保留。

于 2021-04-28T03:10:48.997 回答