如何从Firebase获取数据并在Android中显示



我需要帮助从Firebase获取数据。我已经工作了几个小时了,但还是做不好。

它要么抛出一个空指针或另一个错误,我不明白。我承认我没有Java或Android的任何经验,这是我第一次尝试做一个简单的数据库操作。

任何帮助我理解的人都是非常感激的

编辑我将我的数据库引用修改为:

fDatabase = FirebaseDatabase.getInstance().getReference().child("pelanggan").child("nama");

这是我的数据库结构

这是我的活动:

package com.example.training;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.training.model.pelanggan;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class orderActivity extends AppCompatActivity{
private Button submitOrder;
DatabaseReference fDatabase;
private TextView retrieveTV;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.order_activity);
fDatabase = FirebaseDatabase.getInstance().getReference().child("pelanggan").child("nama");
retrieveTV = findViewById(R.id.idTVRetrieveData);
getname();
}
private void getname() {
fDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String results = dataSnapshot.getValue(String.class);;
retrieveTV.setText(results);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(orderActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show();
}
});
}
}

我还有一个模型类

package com.example.training.model;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class pelanggan {
@SerializedName("ID")
@Expose
private String ID;
@SerializedName("Nama")
@Expose
private String Nama;
@SerializedName("Alamat")
@Expose
private String Alamat;
@SerializedName("Ruang")
@Expose
private String Ruang;
//Constructor
public pelanggan (){}
public pelanggan (String Nama, String Alamat, String Ruang){
this.Nama = Nama;
this.Alamat = Alamat;
this.Ruang = Ruang;
}
public String getNama() {return Nama;}
public String getAlamat() {return  Alamat;}
public String getRuang() {return Ruang;}
}

我也试过这样做,但给我null指针异常<<strong>替代版本/strong>

private void getname() {
fDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
pelanggan pelanggan = dataSnapshot.getValue(pelanggan.class);
String nama = pelanggan.getNama();
retrieveTV.setText(nama);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(orderActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show();
}
});
}

这是我的LOGTCAT

2022-06-26 14:24:03.006 20151-20151/? I/xample.trainin: Late-enabling -Xcheck:jni
2022-06-26 14:24:03.033 20151-20151/? E/xample.trainin: Unknown bits set in runtime_flags: 0x48000
2022-06-26 14:24:03.537 20151-20151/com.example.training I/Perf: Connecting to perf service.
2022-06-26 14:24:03.574 20151-20151/com.example.training I/FirebaseApp: Device unlocked: initializing all Firebase APIs for app [DEFAULT]
2022-06-26 14:24:03.599 20151-20151/com.example.training I/FirebaseCrashlytics: Initializing Firebase Crashlytics 18.2.11 for com.example.training
2022-06-26 14:24:03.604 20151-20186/com.example.training I/DynamiteModule: Considering local module com.google.android.gms.measurement.dynamite:73 and remote module com.google.android.gms.measurement.dynamite:74
2022-06-26 14:24:03.604 20151-20186/com.example.training I/DynamiteModule: Selected remote version of com.google.android.gms.measurement.dynamite, version >= 74
2022-06-26 14:24:03.605 20151-20186/com.example.training V/DynamiteModule: Dynamite loader version >= 2, using loadModule2NoCrashUtils
2022-06-26 14:24:03.635 20151-20186/com.example.training W/xample.trainin: ClassLoaderContext type mismatch. expected=PCL, found=DLC (PCL[] | DLC[];PCL[/data/app/com.example.training-cGP13cDlR449jFz3H3Slsw==/base.apk*196330711:/data/app/com.example.training-cGP13cDlR449jFz3H3Slsw==/base.apk!classes2.dex*3787358178:/data/app/com.example.training-cGP13cDlR449jFz3H3Slsw==/base.apk!classes3.dex*1858276209:/data/app/com.example.training-cGP13cDlR449jFz3H3Slsw==/base.apk!classes4.dex*1863173146])
2022-06-26 14:24:03.635 20151-20186/com.example.training W/xample.trainin: Found duplicate classes, falling back to extracting from APK : /data/user_de/0/com.google.android.gms/app_chimera/m/000000af/MeasurementDynamite.apk
2022-06-26 14:24:03.635 20151-20186/com.example.training W/xample.trainin: NOTE: This wastes RAM and hurts startup performance.
2022-06-26 14:24:03.635 20151-20186/com.example.training W/xample.trainin: Found duplicated class when checking oat files: 'Landroid/support/v4/app/RemoteActionCompatParcelizer;' in /data/app/com.example.training-cGP13cDlR449jFz3H3Slsw==/base.apk and /data/user_de/0/com.google.android.gms/app_chimera/m/000000af/MeasurementDynamite.apk
2022-06-26 14:24:03.635 20151-20186/com.example.training W/xample.trainin: 
2022-06-26 14:24:03.736 20151-20151/com.example.training I/FirebaseInitProvider: FirebaseApp initialization successful
2022-06-26 14:24:03.744 20151-20196/com.example.training V/FA: App measurement collection enabled
2022-06-26 14:24:03.745 20151-20196/com.example.training V/FA: App measurement enabled for app package, google app id: com.example.training, 1:44525531754:android:c57282d36986f9bcb05013
2022-06-26 14:24:03.746 20151-20196/com.example.training I/FA: App measurement initialized, version: 65003
2022-06-26 14:24:03.746 20151-20196/com.example.training I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
2022-06-26 14:24:03.746 20151-20196/com.example.training I/FA: To enable faster debug mode event logging run:
adb shell setprop debug.firebase.analytics.app com.example.training
2022-06-26 14:24:03.746 20151-20196/com.example.training D/FA: Debug-level message logging enabled
2022-06-26 14:24:03.757 20151-20151/com.example.training I/FeatureParser: can't find citrus.xml in assets/device_features/,it may be in /vendor/etc/device_features
2022-06-26 14:24:03.773 20151-20151/com.example.training E/libc: Access denied finding property "ro.vendor.df.effect.conflict"
2022-06-26 14:24:03.759 20151-20151/com.example.training W/xample.training: type=1400 audit(0.0:456294): avc: denied { read } for name="u:object_r:vendor_default_prop:s0" dev="tmpfs" ino=16963 scontext=u:r:untrusted_app:s0:c61,c257,c512,c768 tcontext=u:object_r:vendor_default_prop:s0 tclass=file permissive=0
2022-06-26 14:24:03.774 20151-20151/com.example.training E/libc: Access denied finding property "ro.vendor.knock.type"
2022-06-26 14:24:03.759 20151-20151/com.example.training W/xample.training: type=1400 audit(0.0:456295): avc: denied { read } for name="u:object_r:vendor_default_prop:s0" dev="tmpfs" ino=16963 scontext=u:r:untrusted_app:s0:c61,c257,c512,c768 tcontext=u:object_r:vendor_default_prop:s0 tclass=file permissive=0
2022-06-26 14:24:03.786 20151-20196/com.example.training V/FA: Connecting to remote service
2022-06-26 14:24:03.799 20151-20196/com.example.training V/FA: Connection attempt already in progress
2022-06-26 14:24:03.806 20151-20196/com.example.training V/FA: Connection attempt already in progress
2022-06-26 14:24:03.860 20151-20186/com.example.training V/FA: onActivityCreated
2022-06-26 14:24:03.948 20151-20151/com.example.training W/xample.trainin: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
2022-06-26 14:24:03.949 20151-20151/com.example.training W/xample.trainin: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
2022-06-26 14:24:04.106 20151-20196/com.example.training V/FA: Activity resumed, time: 4280644798
2022-06-26 14:24:04.111 20151-20196/com.example.training I/FA: Tag Manager is not found and thus will not be used
2022-06-26 14:24:04.132 20151-20151/com.example.training W/Looper: PerfMonitor looperActivity : package=com.example.training/.orderActivity time=355ms latency=679ms running=325ms  procState=2 ClientTransaction{ callbacks=[android.app.servertransaction.LaunchActivityItem] lifecycleRequest=android.app.servertransaction.ResumeActivityItem } historyMsgCount=1 (msgIndex=1 wall=705ms seq=2 running=651ms runnable=8ms late=2ms h=android.app.ActivityThread$H w=110)
2022-06-26 14:24:04.133 20151-20151/com.example.training W/Looper: PerfMonitor looperActivity : package=com.example.training/.orderActivity time=0ms latency=1034ms running=0ms  procState=2 ClientTransaction{ callbacks=[android.app.servertransaction.TopResumedActivityChangeItem] } historyMsgCount=2 (msgIndex=1 wall=705ms seq=2 running=651ms runnable=8ms late=2ms h=android.app.ActivityThread$H w=110) (msgIndex=2 wall=355ms seq=3 running=325ms runnable=9ms late=679ms h=android.app.ActivityThread$H w=159)
2022-06-26 14:24:04.136 20151-20196/com.example.training V/FA: Connection attempt already in progress
2022-06-26 14:24:04.138 20151-20196/com.example.training V/FA: Connection attempt already in progress
2022-06-26 14:24:04.154 20151-20208/com.example.training D/NetworkSecurityConfig: No Network Security Config specified, using platform default
2022-06-26 14:24:04.180 20151-20203/com.example.training I/AdrenoGLES-0: QUALCOMM build                   : 243b6bc, I98aee2b40e
Build Date                       : 12/08/20
OpenGL ES Shader Compiler Version: EV031.29.00.16
Local Branch                     : 
Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.8.15.R1.10.00.00.643.066
Remote Branch                    : NONE
Reconstruct Branch               : NOTHING
2022-06-26 14:24:04.180 20151-20203/com.example.training I/AdrenoGLES-0: Build Config                     : S P 8.0.16 AArch64
2022-06-26 14:24:04.180 20151-20203/com.example.training I/AdrenoGLES-0: Driver Path                      : /vendor/lib64/egl/libGLESv2_adreno.so
2022-06-26 14:24:04.186 20151-20203/com.example.training I/AdrenoGLES-0: PFP: 0x016ee188, ME: 0x00000000
2022-06-26 14:24:04.276 20151-20196/com.example.training D/FA: Connected to remote service
2022-06-26 14:24:04.278 20151-20196/com.example.training V/FA: Processing queued up service tasks: 5
2022-06-26 14:24:09.346 20151-20196/com.example.training V/FA: Inactivity, disconnecting from the service

这是LOGCAT,那里有nullPointer异常,我将复制粘贴只有红色字母:

E/libc: Access denied finding property "ro.vendor.df.effect.conflict"
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.training, PID: 22287
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.training.model.pelanggan.getNama()' on a null object reference
at com.example.training.orderActivity$1.onDataChange(orderActivity.java:38)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:226)
at android.app.ActivityThread.main(ActivityThread.java:7592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

只有当我使用备用版本时,这个Logcat才会发生它强制关闭应用程序,不像第一个代码

您将得到以下错误:

. lang。NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String com.example.training.model.pelanggan.getNama()'

因为您试图从错误的引用中读取name的值。当您使用以下代码行时:

fDatabase = FirebaseDatabase.getInstance().getReference().child("pelanggan").child("nama");

这意味着你正在尝试从以下位置读取一个值:

root/pelanggan/nama

实际上并不存在。看看你的数据库模式,你错过了一个孩子。所以正确的引用应该是:

fDatabase = FirebaseDatabase.getInstance()
.getReference()
.child("pelanggan")
.child("pg89814") //👈
.child("nama");

但是,如果您想将该子对象作为pelanggan类型的对象来读取,则应该使用以下代码行:

private void getname() {
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = db..child("pelanggan").child("pg89814");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
pelanggan pelanggan = dataSnapshot.getValue(pelanggan.class);
String nama = pelanggan.getNama();
retrieveTV.setText(nama);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(orderActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show();
}
});
}