Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将字符串附加到Firebase实时数据库的列表中_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 将字符串附加到Firebase实时数据库的列表中

Android 将字符串附加到Firebase实时数据库的列表中,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想在Firebase实时数据库的列表中添加一个字符串。 (我的代码已经运行,但存在问题) 因此,数据库如下所示: message: 0: "some string" 1: "another string" 2: "some string" 但我认为这段代码的问题在于,如果有人读取了消息的数量,然后想写一条消息,那么当另一个用户同时写一条消息时,就会出现问题(因为消息的数量会发生变化) 在多用户Firebase中尝试使用顺序数字索引(通常也称为数组索引或自动增量值)是一

我想在Firebase实时数据库的列表中添加一个字符串。 (我的代码已经运行,但存在问题)

因此,数据库如下所示:

message:
    0: "some string"
    1: "another string"
    2: "some string"
但我认为这段代码的问题在于,如果有人读取了消息的数量,然后想写一条消息,那么当另一个用户同时写一条消息时,就会出现问题(因为消息的数量会发生变化)


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

  • 正如您已经注意到的,用户有可能会覆盖彼此的数据。但是,这是可以修复的,如果您需要基于现有值为值设置属性,那么这是一种方法。下面这个例子正是您所需要的:

    // 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应用程序通常使用不同的机制来生成密钥。API的内置生成一个唯一的、始终递增的密钥。虽然此键不如顺序数字键可读,但它们确实解决了上述两个问题,而无需您自己为其编写更多代码。使用
push()

final DatabaseReference myRef = database.getReference("message");
myRef.push().setValue("SOME STRING");
请注意,本主题已经介绍了很多内容,因此我建议您也可以查看:

  • (具有Android的交易代码)

但是当我使用“push”时,当我想要读取字符串时,如何才能获得字符串的顺序?我不确定我是否理解你的意思。无论子节点是如何使用
DataSnapshot.getKey()
生成的,您总是以相同的方式获取其密钥。但重要的区别在于,如果使用
push()
,则不需要知道现有的键就可以生成新的/下一个键。如果要获取
onDataChange中的所有键,则可以执行以下操作:
for(DataSnapshot childSnapshot:DataSnapshot.getChildren(){System.out.println(childSnapshot.getKey());}
final DatabaseReference myRef = database.getReference("message");
myRef.push().setValue("SOME STRING");