Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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
Java 将数据写入Firebase,Android_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 将数据写入Firebase,Android

Java 将数据写入Firebase,Android,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个使用Firebase的应用程序,它使用“推送”来写记录。我的问题是更新该记录的内容。欢迎任何帮助。我使用的是Firebase身份验证email/密码,效果很好。我还有一个Java类中的数据库,它也可以正常工作。在onCreate方法中,我引用了以下数据: databasePropertyData FirebaseDatabase.getInstance().getReference("users"); 使用按钮,我可以创建具有唯一标识符的新记录,这就是我想要的: String

我有一个使用Firebase的应用程序,它使用“推送”来写记录。我的问题是更新该记录的内容。欢迎任何帮助。我使用的是
Firebase身份验证
email/密码,效果很好。我还有一个Java类中的数据库,它也可以正常工作。在
onCreate
方法中,我引用了以下数据:

 databasePropertyData FirebaseDatabase.getInstance().getReference("users");
使用按钮,我可以创建具有唯一标识符的新记录,这就是我想要的:

    String ownerId = databasePropertyData.push().getKey();
    PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
    databasePropertyData.child(ownerId).setValue(propertyData);
这段代码工作正常,创建了一个用户id为的记录

然而,我现在想更新这一特定记录,这就是问题所在。我使用的代码(以及无数变体)建立了一个新记录,而不是更新现有数据。这是我失败实验的一个例子:

   String ownerId = databasePropertyData.getKey();
   databasePropertyData.child(ownerId).setValue(name,ownerName);

任何帮助都将不胜感激。

发生这种情况是因为您正在使用
push()
方法。它会在您每次登录时生成一个新的随机密钥。要解决此问题,请使用
uid
而不是按键

PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
databasePropertyData.child(uid).setValue(propertyData);
使用
uid
的好处是可以非常轻松地更新记录

databasePropertyData.child(uid).updateChildren(propertyData);

这是因为您正在使用
push()
方法。它会在您每次登录时生成一个新的随机密钥。要解决此问题,请使用
uid
而不是按键

PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
databasePropertyData.child(uid).setValue(propertyData);
使用
uid
的好处是可以非常轻松地更新记录

databasePropertyData.child(uid).updateChildren(propertyData);

您可以使用updateChild更新指定字段,以下是ref:

您可以使用updateChild更新指定字段,以下是参考:

在这里,您应该使用与要更新的propertyData相同的Id,而不是创建新的
所有者Id
。然后使用
updateChildren
setValue
方法,可以更新值。 那么这样就可以了:

databasePropertyData = FirebaseDatabase.getInstance().getReference("users");
PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
databasePropertyData.child(ownerId).setValue(propertyData);
在这里,您应该使用与要更新的propertyData相同的Id,而不是创建新的
所有者Id
。然后使用
updateChildren
setValue
方法,可以更新值。 那么这样就可以了:

databasePropertyData = FirebaseDatabase.getInstance().getReference("users");
PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
databasePropertyData.child(ownerId).setValue(propertyData);

您的数据库中有以下内容:

 users
   randomid
       ownerId: 12345
       ownerName: userx
       name: anothername
要进行更新,您可以这样做,因为您使用的是
push()
,然后使用包含键的变量执行以下操作:

String ownerId = databasePropertyData.push().getKey(); //the variable that has the key, not a new variable
PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
databasePropertyData.child(ownerId).setValue(propertyData);
或者,您可以更改数据库结构并使用用户id:

     FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
     PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
    databasePropertyData.child(ownerId).setValue(propertyData);
或者,您可以进行查询并从数据库中检索
push()
键,并更新查询中的值


但您必须更新所有3个字段。

您的数据库中有:

 users
   randomid
       ownerId: 12345
       ownerName: userx
       name: anothername
要进行更新,您可以这样做,因为您使用的是
push()
,然后使用包含键的变量执行以下操作:

String ownerId = databasePropertyData.push().getKey(); //the variable that has the key, not a new variable
PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
databasePropertyData.child(ownerId).setValue(propertyData);
或者,您可以更改数据库结构并使用用户id:

     FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
     PropertyData propertyData = new PropertyData(ownerId, ownerName, name);
    databasePropertyData.child(ownerId).setValue(propertyData);
或者,您可以进行查询并从数据库中检索
push()
键,并更新查询中的值


但是你必须更新所有3个字段。

你能显示节点pitcure吗?你能显示节点pitcure吗?这是一个指向谷歌参考页面的链接,我已经看过了。但是,该链接是指向web参考的,而不是Android!!这是一个指向谷歌参考页面的链接,我已经看过了。但是,该链接是指向web参考的,而不是Android!!谢谢你的回复。在应用程序上,用户可以设置一个具有身份验证的帐户,然后设置到数据输入页面的链接。该页面上的“保存”按钮运行一个选项,该选项使用“推送”为新用户运行代码。或者为现有用户运行代码。新的用户代码可以正常工作,而现有的用户代码不能。我尝试了您的示例,但无法使其工作-我执行getCurrentUser并将其放入字符串等。使用updateChildren(名称,所有者名称),我在(所有者,所有者名称)部分遇到错误-“无法应用数据库引用中的完成侦听器”。有什么想法吗?我只是复制了你的代码,没有看到参数。正确的参数是
propertyData
对象。请看我的最新答案。这肯定会奏效的。你能证实吗?嘿。经过一些调整后,它现在正在按预期编写和更新记录。非常感谢你不辞辛劳地帮忙。非常感谢您的回复。在应用程序上,用户可以设置一个具有身份验证的帐户,然后设置到数据输入页面的链接。该页面上的“保存”按钮运行一个选项,该选项使用“推送”为新用户运行代码。或者为现有用户运行代码。新的用户代码可以正常工作,而现有的用户代码不能。我尝试了您的示例,但无法使其工作-我执行getCurrentUser并将其放入字符串等。使用updateChildren(名称,所有者名称),我在(所有者,所有者名称)部分遇到错误-“无法应用数据库引用中的完成侦听器”。有什么想法吗?我只是复制了你的代码,没有看到参数。正确的参数是
propertyData
对象。请看我的最新答案。这肯定会奏效的。你能证实吗?嘿。经过一些调整后,它现在正在按预期编写和更新记录。非常感谢你不辞辛劳地帮忙。非常感谢。我确实使用了.getCurrentUser()。因此,用户已登录到一个已设置并保存数据的已验证帐户。我正在努力解决的是如何覆盖现有数据。即使使用getCurrentUser,我似乎也无法让它工作。我认为getCurrentUser可以访问现有数据。Srushti,没有带两个参数的
setValue()
方法。setValue()方法不是构造函数。您需要将
propertyData
对象作为参数传递,而不是实际值。@AlexMamo对此表示抱歉。我已经更新了答案。firebase将仅更新您在对象中设置的值。所以,如果只想更新名称,那么在对象中设置名称,然后在setValue方法中传递该对象。因此,用户已登录到