我对android和firebase很新。我正在创建一个通过蓝牙连接设备的应用程序,然后在配对后,用户可以共享设备。现在一切顺利,直到我尝试从Firebase检索数据。 这是我的数据库结构: Database Structure
共享设备是用户可以与他人共享的设备。用户设备是用户保存的设备。 “meh”是设备的名称。 以下是我尝试访问数据的方法:
public class RecievedKeys extends AppCompatActivity {
String key;
TextView mName;
TextView mDevice;
String name;
String MAC;
User user = new User();
DatabaseReference mDatabaseRef;
String decPass;
String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recieved_keys);
mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Shared_With").child(User.getUid());
mName = (TextView)findViewById(R.id.name);
mDevice = (TextView)findViewById(R.id.MAC);
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
name = dataSnapshot.child("Name").getValue().toString();
MAC = dataSnapshot.child("MAC").getValue().toString();
password = dataSnapshot.child("password").getValue().toString();
System.out.println(name);
mName.setText(name);
mDevice.setText(MAC);
decPassword(password);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我无法得到任何东西,相反,我得到一个异常抛出。任何指导都将不胜感激。
这是抛出的异常,NullPointer:
05-12 06:10:25.608 5268-5268/habibqureshi.simplegui.simplegui E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at habibqureshi.simplegui.SmartLock.RecievedKeys$1.onDataChange(RecievedKeys.java:38)
at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5910)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
05-12 06:10:25.608 5268-5426/habibqureshi.simplegui.simplegui D/FA: Logging event (FE): _ae, Bundle[{_o=crash, _sc=RecievedKeys, _si=4592305897079779979, timestamp=1494551425619, fatal=1}]
05-12 06:10:25.939 5268-5268/habibqureshi.simplegui.simplegui E/AndroidRuntime: FATAL EXCEPTION: main
Process: habibqureshi.simplegui.simplegui, PID: 5268
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at habibqureshi.simplegui.SmartLock.RecievedKeys$1.onDataChange(RecievedKeys.java:38)
at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5910)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
我需要做的是访问Shared_With-> UID-> Email-> name-> children中的值。
答案 0 :(得分:0)
也许您需要以不同的方式构建数据。 你可以这样做:
{
shared {
receiver_id {
user_id: true,
user_id: true,
user_id: true
}
}
devices {
user_id {
meh: {
attribute: 'lorem ipsum'
}
}
}
}
答案 1 :(得分:0)
要实现此目的,请使用以下代码:
mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Shared_With").child(User.getUid()).child(User.getEmail()).child("meh");
mName = (TextView)findViewById(R.id.name);
mDevice = (TextView)findViewById(R.id.MAC);
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
name = (String) dataSnapshot.getKey();
MAC = (String) dataSnapshot.child("MAC").getValue();
password = (String) dataSnapshot.child("password").getValue();
System.out.println(name);
mName.setText(name);
mDevice.setText(MAC);
decPassword(password);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
问题是你遗失了reference
中的一些孩子。
希望它有所帮助。