我正在使用 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:資料寫入成功。
However, when the data is not successfully written into the Firebase Database, I just don't get any message from the dbTAG of the onComplete method and no new entry can be found in the database. I just get the LogTag messages:
E/LogTag: Before write into DB
E/LogTag: After write into DB
Now actually I have 2 questions:
- Why sometimes the data can be written into the Firebase Database and sometimes not and why this seems to happen "randomly"? Can you think of some reasons?
- 更重要的是:當資料無法寫入 Firebase 資料庫時,我如何獲得錯誤訊息以便通知用戶?與此相關:
Log.e("dbTAG", task.getException().getMessage());當資料未成功寫入 Firebase 資料庫時,為什么我沒有收到訊息?所以onComplete當資料沒有成功存盤時,方法的else分支不會被執行。
如果您需要任何進一步的資訊,請告訴我。
uj5u.com熱心網友回復:
為什么有時資料可以寫入 Firebase 資料庫而有時不能,為什么這似乎是“隨機”發生的?你能想到一些原因嗎?
這很可能是因為缺乏互聯網連接。要解決此問題,您應該啟用離線持久性。在 Java 代碼中,這可以使用以下行來完成:
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
根據檔案:
即使您的應用暫時失去網路連接,Firebase 應用也能正常作業。
Firebase 應用會自動處理臨時網路中斷。離線時快取資料可用,Firebase 會在網路連接恢復后重新發送任何寫入。
并回答你的第二個問題:
更重要的是:當資料無法寫入 Firebase 資料庫時,我如何獲得錯誤訊息以便通知用戶?與此相關:為什么我沒有得到 Log.e("dbTAG", task.getException().getMessage()); 資料未成功寫入 Firebase 資料庫時的訊息?所以當資料沒有成功存盤時,onComplete方法的else分支不會被執行。
您正在使用以下方法以正確的方式處理錯誤:
Log.e("dbTAG", task.getException().getMessage());
當寫入資料出現問題時,您會收到一條錯誤訊息,這意味著 Firebase 服務器會拒絕寫入操作,例如,當您的安全規則不正確時。
另請注意,Firebase 實時資料庫 SDK在沒有互聯網連接時不會拋出例外,這是有道理的,因為 Firebase 實時資料庫旨在離線作業。在幕后,Firebase 實時資料庫 SDK 會嘗試重新連接,直到設備重新連接。但是,當 Firebase 服務器由于安全規則問題拒絕請求時,它確實會拋出例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/351478.html
標籤:爪哇 安卓 火力基地 Firebase 实时数据库 谷歌云平台
