我想将一个字符串附加到 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(使用前将#替换为@)