数据未从 Android 写入 Firebase 数据库
Posted
技术标签:
【中文标题】数据未从 Android 写入 Firebase 数据库【英文标题】:Data is not written into the Firebase Database from Android 【发布时间】:2021-11-17 22:18:54 【问题描述】:我已经建立了一个有 2 个节点的 Firebase 数据库。一个节点称为“配料”,另一个称为“订单”。我使用 JSON 文件手动设置节点,我刚刚在节点“订单”中手动输入了 1 个条目。可以看到数据库结构的截图:
现在我想在“订单”表中添加更多条目(所以基本上我想再添加一行)。
在我的 android 应用程序中,我使用以下代码:
// in the class definition of the Fragment
public DatabaseReference firebase_DB;
...
// in the oneCreate Method of the Fragment
firebase_DB = FirebaseDatabase.getInstance().getReference("orders");
...
// when clicking on a button in the Fragment which calls the onClick method
String id = firebase_DB.push().getKey();
DB_Object_Test currentOrder= new DB_Object_Test("testInfo_2", "testName", 2);
firebase_DB.child(id).setValue(currentOrder);
所以基本上代码运行没有错误,firebase_DB.child(id).setValue(currentOrder);
被调用。但是,Firebase 控制台中没有任何变化。我在那里看不到任何新条目。 firebase 数据库已正确连接到应用程序(至少 Android Studio 是这样说的),并且我没有指定任何禁止在数据库上写入内容的规则。相同的数据存储在 SQLite 数据库中没有任何问题。
你们谁能想到这个问题的可能原因?为什么新行没有写入firebase数据库?我会感谢每一条评论。
编辑:这是在片段中单击“订购”按钮后写入 firebase 数据库的调整后代码(通过使用 3 种不同的方法)。
public void onClick(View view)
if(view.getId() == R.id.ordering_button)
/* Firebase approach 1
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("");
DatabaseReference usersRef = ref.child("orders");
Map<String, DB_Object_Test> order = new HashMap<>();
order.put("order_2", new DB_Object_Test("1", "testInfo_2", "testName", "2"));
usersRef.setValue(order);
*/
/*
Firebase approach 3 (by Alex)
*/
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ordersRef = rootRef.child("orders");
Map<String, Object> order = new HashMap<>();
order.put("info", "No additional information");
order.put("name", "Another Test Order");
order.put("table", "15");
Log.e("LogTag", "Before write firebase");
ordersRef.child("order_2").setValue(order).addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
Log.e("LogTag", "During on Complete firebase");
if (task.isSuccessful())
Log.e("dbTAG", "Data successfully written.");
else
Log.e("dbTAG", task.getException().getMessage());
);
Log.e("LogTag", "Afer write firebase");
/* Firebase approach 2
DatabaseReference firebase_DB = FirebaseDatabase.getInstance().getReference("orders");
String id = firebase_DB.push().getKey();
DB_Object_Test currentOrder= new DB_Object_Test(id, "testInfo_2", "testName", "2");
firebase_DB.child(id).setValue(currentOrder);
//Option 2*
//firebase_DB.setValue(currentOrder);
Log.e("LogTag", "firebase_DB.child(id): " + firebase_DB.child(id));
*/
Navigation.findNavController(getView()).navigate(...);
【问题讨论】:
可能firebase_DB = FirebaseDatabase.getInstance().getReference().getChild("orders");
可以工作
【参考方案1】:
为了能够在您的“订单”节点下添加另一个对象,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ordersRef = rootRef.child("orders");
Map<String, Object> order = new HashMap<>();
order.put("info", "No additional information");
order.put("name", "Another Test Order");
order.put("table", "15");
ordersRef.child("order_2").setValue(order).addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
if (task.isSuccessful())
Log.d("TAG", "Data successfully written.");
else
Log.d("TAG", task.getException().getMessage());
);
如果您在 Firebase 控制台中设置了适当的安全规则,则此代码仅有效:
"rules":
".read": true,
".write": true
请记住保留这些规则仅用于测试目的。除此之外,您还可以附加一个完整的侦听器以查看是否出现问题。
如果你想使用DatabaseReference#push()方法,那么你应该使用下面这行代码:
ordersRef.push().setValue(order);
编辑:
根据你上一条评论:
数据库位置:比利时 (europe-west1)
您应该从以下帖子中查看我的答案,并将正确的 URL 添加到 getInstance() 方法:
getInstance() doesn't work with other location than us-central1 in Realtime Database在您的特定情况下应该是:
DatabaseReference rootRef = FirebaseDatabase.getInstance("https://drink-server-db-default-rtdb.europe-west1.firebasedatabase.app").getReference();
【讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 @Alex:嘿,Alex,又是我。我发现根据您建议的答案,我无法修改您建议的代码中的任何变量。但我需要这样做。有什么想法可以修改您建议的代码中的布尔变量吗?我将不胜感激您的任何进一步评论。我在这里问了一个单独的问题***.com/questions/69360358/… @VanessaF 嘿 Vanessa。我不确定我明白你的意思。但请在 *** 上使用自己的MCVE 发布一个新问题,以便我和其他 Firebase 开发人员可以帮助您。 感谢亚历克斯的评论。正如我在上一条评论中提到的,我已经在 StackOveflow 上提出了一个关于此问题的新问题,您可以在此处找到 ***.com/questions/69360358/… @VanessaF 好的,我去看看,如果我知道答案,我会写信给你。以上是关于数据未从 Android 写入 Firebase 数据库的主要内容,如果未能解决你的问题,请参考以下文章
当页面数据未从 Firebase 完全加载时显示加载指示器/微调器 - Flutter