将字符串附加到 Firebase 实时数据库上的列表 [重复]

2024-04-29

我想将一个字符串附加到 Firebase 实时数据库上的列表中。 (我的代码已经可以运行,但是有问题)

所以数据库看起来像这样:

message:
    0: "some string"
    1: "another string"
    2: "some string"

但我认为这段代码的问题是,如果有人读取消息数然后想要写入消息,那么当另一个用户同时写入消息时就会出现问题(因为消息数会改变) )。

FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myRef = database.getReference("message");

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        myRef.child(
            String.valueOf(dataSnapshot.getChildrenCount())
            ).setValue("SOME STRING");
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

由于某些原因,尝试在多用户 Firebase 中使用顺序数字索引(通常也称为数组索引或自动增量值)是一种反模式。

  • 正如您自己已经指出的那样,用户有可能覆盖彼此的数据。但这是可以解决的使用交易 https://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions,如果您需要根据现有值赋予一个值,则可以采用这种方法。这JavaScript 的参考文档DatabaseReference.transaction method https://firebase.google.com/docs/reference/js/firebase.database.Reference#transaction这个例子几乎就是你所需要的:

    // Increment Ada's rank by 1.
    var adaRankRef = firebase.database().ref('users/ada/rank');
    adaRankRef.transaction(function(currentRank) {
      // If users/ada/rank has never been set, currentRank will be `null`.
      return currentRank + 1;
    });
    

    Android 中的语法稍微复杂一些,但工作原理是一样的。

  • 当事务有效时,这意味着应用程序仅在用户连接到服务器时才能工作。当他们离线时,交易将会失败。

由于这些原因,Firebase 应用程序通常使用不同的机制来生成密钥。内置的push() method https://firebase.google.com/docs/reference/js/firebase.database.Reference#pushAPI 的生成一个唯一的、始终递增的密钥。虽然此键不如顺序数字键可读,但它们确实解决了上述两个问题,而无需您自己编写更多代码。和push()添加消息变得如此简单:

final DatabaseReference myRef = database.getReference("message");
myRef.push().setValue("SOME STRING");

请注意,这个主题已经被涵盖了很多,所以我建议还查看:

  • 最佳实践:Firebase 中的数组 https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html
  • 确保唯一标识符的 2^120 种方法 https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html
  • 如何在 Firebase 中创建自动递增键? https://stackoverflow.com/questions/39519021/how-to-create-auto-incremented-key-in-firebase
  • 在 Firebase 中自动递增值 https://stackoverflow.com/questions/28915706/auto-increment-a-value-in-firebase(有Android交易代码)
  • 我如何自动增加 firebase 中的值 https://stackoverflow.com/q/41838131
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串附加到 Firebase 实时数据库上的列表 [重复] 的相关文章

随机推荐