2017-05-12 3 views
0

나는 안드로이드와 파이어베이스에 아주 익숙하다. 내가 블루투스를 통해 장치와 연결하는 응용 프로그램을 만들고 나서, 페어링 후에 사용자가 장치를 공유 할 수 있습니다. 이제는 Firebase에서 데이터를 가져 오기 전까지는 문제가 없습니다. 가 여기 내 데이터베이스 구조입니다 : Database Structurefirebase에 액세스하는 방법 값이없는 키

공유 장치는 사용자가 다른 사람과 공유 할 수있는 것들입니다. 사용자 장치는 사용자가 저장하는 장치입니다. "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) { 

      } 
     }); 
    } 

난 아무것도 얻을 수 없습니다 생각 대신에, 나는 예외가 던져 : 여기 내가 데이터에 액세스하려고하는 방법이다. 모든 지침을 부탁드립니다.

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-> 이메일 -> 이름 -> 어린이의 값에 액세스 할 수 있습니다 :

여기, NullPointer 발생되는 예외입니다.

+0

예외가 던져지는 곳을 보여주는 logcat을 업로드하십시오. - 여기에있는 사람들이 잘못된 것을 식별하는 데 도움이됩니다. – scb998

+0

logcat을 Addes합니다. –

답변

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 일부 차일 누락 된 것이 었습니다 :

{ 
    shared { 
     receiver_id { 
      user_id: true, 
      user_id: true, 
      user_id: true 
     } 
    } 

    devices { 
     user_id { 

      meh: { 
       attribute: 'lorem ipsum' 
      } 
     } 
    } 
} 
+0

그게 내가 혼란스러워하는 곳입니다. 이메일, meh, 그들은 사용자 생성. 어떻게 접근합니까? uid를 사용하면 쉽고 mac n password에도 액세스 할 수 있습니다. 하지만 어떻게 사용자 생성 된 것들을 관리합니까? –

+0

그런 식으로하는 것이 좋지는 않으며 그렇게하지 않아도되지만 실제로 작동하는지 확인해보십시오. 하지만 당신이해야 할 일은 firebase에서 json을 매핑하는 클래스를 생성하는 것이고 firebase SDK는 클래스 객체에서 json을 쉽게 변환 할 수 있습니다. 여기에 완전한 예제가 있습니다 : https://firebase.google.com/docs/database/android/read-and-write –

+0

이미 다른 클래스에서이 작업을 수행했습니다. 여기서 문제는 shared_with 데이터가 UID가 발신자의 것과 같이 생성된다는 것입니다. 이메일은 수신자에게 전달됩니다. 이제 수신 측에서는 사용자가 데이터베이스에 값을 알거나 가져 와서 전송 된 내용을 볼 수 있습니까? 그것이 문제입니다. –

0

이를 달성하기를, 다음 코드를 사용하십시오.

희망이 있습니다.

관련 문제