数据未从 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

在 Angular 7 中未从 Firebase 检索数据

Firebase 查询未从数据库返回任何结果

未从 firebase 数据库中检索个人资料图片

适用于 iOS 的 Firebase 动态链接 - 查询参数未从 iTunes Store 传递

当屏幕未从 Firebase 调用数据时如何显示文本小部件