【发布时间】:2021-12-19 17:42:36
【问题描述】:
我使用的是 Android,我想在 Firebase 实时数据库中存储一些数据。奇怪的是,有时这有效,有时却无效。我认为这可能与我的 WLAN 连接并不总是很好有关,但即使 WLAN 连接良好,有时数据也可以写入 Firebase 数据库,但有时它就无法正常工作。
无论如何,我希望以敬酒的形式向用户发送一条消息,说明数据尚未写入 Firebase 数据库。为此,我有以下 Java 片段:
package com.example.td.bapp;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.Navigation;
import com.example.td.bapp.databinding.TestFragmentBinding ;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
public class TestFragment extends Fragment implements View.OnClickListener {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
private TestFragmentBinding binding;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = TestFragmentBinding.inflate(inflater, container, false);
/*
Set onClickListeners to the buttoms
*/
binding.orderingButton.setOnClickListener(this);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onClick(View view) {
if(view.getId() == R.id.ordering_button) {
/*
Write data into the Firebase DB
*/
long currentTimeMillis = System.currentTimeMillis();
SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-yy");
sdf1.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
SimpleDateFormat sdf2 = new SimpleDateFormat("HH-mm-ss");
sdf1.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
DatabaseReference rootRef = FirebaseDatabase.getInstance("https://drink-server-db-default-rtdb.europe-west1.firebasedatabase.app").getReference();
DatabaseReference ordersRef = rootRef.child("orders");
String id ="table_" + MainActivity.tableNumber + "_order_" + MainActivity.orderNumberOfTheSession + "_date_" + sdf1.format(new Date()) + "_time_" + sdf2.format(new Date());
String name1 = "Test_1";
String name2 = "Test_2";
FirebaseDBItem_Order currentOrder = new FirebaseDBItem_Order(name1, name2);
Log.e("LogTag", "Before write into DB");
ordersRef.child(id).setValue(currentOrder).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.e("dbTAG", "Data successfully written.");
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(getContext(), getString(R.string.message_orderSubmittedSuccessfully), duration);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
else {
Log.e("dbTAG", task.getException().getMessage());
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(getContext(), getString(R.string.message_orderSubmittedNotSuccessfully), duration);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e("LogTag", "After write into DB");
Navigation.findNavController(getView()).navigate(TestFragmentDirections.actionFRCocktailToFRMenu());
}
}
}
如果数据成功写入 Firebase 数据库,则会显示 toast,并且我会收到正确的 dbTAG 和 LogTag 消息:
E/LogTag:写入数据库之前
E/LogTag:写入数据库后
E/dbTAG:数据写入成功。
但是,当数据没有成功写入 Firebase 数据库时,我只是没有从 onComplete 方法的 dbTAG 收到任何消息,并且在数据库中找不到新条目。我刚刚收到 LogTag 消息:
E/LogTag:写入数据库之前
E/LogTag:写入数据库后
现在实际上我有两个问题:
- 为什么有时数据可以写入 Firebase 数据库,有时却不能,为什么这似乎是“随机”发生的?你能想出一些原因吗?
- 更重要的是:当数据无法写入 Firebase 数据库时,如何获得错误消息以便通知用户?与此相关:当数据未成功写入 Firebase 数据库时,为什么我没有收到
Log.e("dbTAG", task.getException().getMessage());消息?所以onComplete方法的else分支在数据没有成功存储的时候不会执行。
如果您需要任何进一步的信息,请告诉我。
【问题讨论】:
标签: java android firebase firebase-realtime-database google-cloud-platform