2016-09-24 78 views
0

我試圖從我的firebase databse通過它的id retreive一個對象。但我的應用程序崩潰與空指針異常。請幫助我。我是Firebase的新手。 此外,我想知道如何找出搜索不成功。 Here's my database contentsAndroid/Firebase:onDataChange()查詢返回空指針異常

這是我的數據複製代碼。 Query類屬於com.google.firebase,不屬於com.firebase.client。

       @Override 
           public void onClick(View view) { 
            key = scanContent; 
            Query q = dbRef.child("idno").equalTo(key); 
            if (key != null) { 
             q.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() { 
              @Override 
              public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) { 
               Item i = dataSnapshot.getValue(Item.class); 
               id.setText(scanContent); 
               nam.setText(i.getName()); 
               brand.setText(i.getBrand()); 
               cost.setText(i.getCost()); 
               sell.setText("Add to list of sold items?"); 
              } 

              @Override 
              public void onCancelled(DatabaseError databaseError) { 
               AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
               builder.setMessage(databaseError.getMessage()) 
                 .setTitle("Error!") 
                 .setPositiveButton(android.R.string.ok, null); 
               AlertDialog dialog = builder.create(); 
               dialog.show(); 
              } 
             }); 

            } else { 
             search.setError("Enter a valid value"); 
            } 
           } 

這裏是我的logcat的內容。

09-24 13:32:26.332 9228-9228/com.strokx.user.stockmanager W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40c03a68) 
09-24 13:32:26.352 9228-9228/com.strokx.user.stockmanager E/UncaughtException: java.lang.NullPointerException 
                        at com.strokx.user.stockmanager.SearchFragment$2$1.onDataChange(SearchFragment.java:106) 
                        at com.google.firebase.database.Query$1.onDataChange(Unknown Source) 
                        at com.google.android.gms.internal.zzaie.zza(Unknown Source) 
                        at com.google.android.gms.internal.zzaje.zzcta(Unknown Source) 
                        at com.google.android.gms.internal.zzajh$1.run(Unknown Source) 
                        at android.os.Handler.handleCallback(Handler.java:605) 
                        at android.os.Handler.dispatchMessage(Handler.java:92) 
                        at android.os.Looper.loop(Looper.java:137) 
                        at android.app.ActivityThread.main(ActivityThread.java:4517) 
                        at java.lang.reflect.Method.invokeNative(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:511) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
                        at dalvik.system.NativeStart.main(Native Method) 
09-24 13:32:26.572 9228-9228/com.strokx.user.stockmanager D/FirebaseCrashApiImpl: throwable java.lang.NullPointerException 
09-24 13:32:26.672 9228-9228/com.strokx.user.stockmanager E/AndroidRuntime: FATAL EXCEPTION: main 
                      java.lang.NullPointerException 
                       at com.strokx.user.stockmanager.SearchFragment$2$1.onDataChange(SearchFragment.java:106) 
                       at com.google.firebase.database.Query$1.onDataChange(Unknown Source) 
                       at com.google.android.gms.internal.zzaie.zza(Unknown Source) 
                       at com.google.android.gms.internal.zzaje.zzcta(Unknown Source) 
                       at com.google.android.gms.internal.zzajh$1.run(Unknown Source) 
                       at android.os.Handler.handleCallback(Handler.java:605) 
                       at android.os.Handler.dispatchMessage(Handler.java:92) 
                       at android.os.Looper.loop(Looper.java:137) 
                       at android.app.ActivityThread.main(ActivityThread.java:4517) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:511) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 

回答

0

修正了它。我的查詢是錯誤的。儘管修復查詢仍然不會使列表視圖顯示檢索結果。我使用了firebase ui list適配器來解決這個問題。我已經發布了下面的正確代碼,如果它可以幫助任何人。感謝大家。

dbRef= FirebaseDatabase.getInstance().getReferenceFromUrl("https://stockmanager-142503.firebaseio.com/Items"); 


     imgbtn.setOnClickListener(new View.OnClickListener() { 
             @Override 
             public void onClick(View view) { 
              key = scanContent; 
              Query q = dbRef.orderByChild("idno").equalTo(key); 
              FirebaseListAdapter<Item> adapter =new FirebaseListAdapter<Item>(getActivity(),Item.class,R.layout.rowitem,q) { 
               @Override 
               protected void populateView(View v, Item item, int position) { 
                TextView text1=(TextView)v.findViewById(R.id.text1); 
                TextView text2=(TextView)v.findViewById(R.id.text2); 
                TextView text3=(TextView)v.findViewById(R.id.text3); 
                TextView text4=(TextView)v.findViewById(R.id.text4); 
                TextView text5=(TextView)v.findViewById(R.id.text5); 
                text1.setText(item.getIdno()); 
                text2.setText(item.getName()); 
                text3.setText(item.getBrand()); 
                text4.setText(item.getCost()); 
                text5.setText(item.getDate()); 
                solditem=item; 
               } 
              }; 
              sell.setText("Add this result to Sold Items List?"); 
             sList.setAdapter(adapter); 
             } 
            }); 
0

我想你需要一個默認的空構造函數爲你的Item類。

+0

這似乎不是它。 –

0

當您對Firebase數據庫執行查詢時,結果將成爲項目列表。即使您的查詢只有一個匹配項,結果也會是一個列表。所以,你的代碼需要處理的列表,通過遍歷dataSnapshot.getChildren()

Query q = dbRef.child("idno").equalTo(key); 
if (key != null) { 
    q.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() { 
     @Override 
     public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) { 
      (for DataSnapshot itemSnapshot: dataSnapshot.getChildren()) { 
       Item i = dataSnapshot.getValue(Item.class); 
       ... 

我們最近添加的如何做到這一點的Firebase documentation on filtering data with queries的例子。

+0

我試過這個。但顯然,for循環內的代碼永遠不會執行。我的數據也存在於數據庫中。我該怎麼辦? –

+0

Btw這是我的數據庫引用:dbRef = FirebaseDatabase.getInstance()。getReferenceFromUrl(「https://stockmanager-142503.firebaseio.com/Items」); –

+0

既然你提到'com.firebase.client',你是否在你的應用程序的任何地方使用'com.firebase'?您無法混合使用Firebase版本。由於您使用的是FirebaseDatabase.getInstance(),所以您的Firebase依賴項必須爲9.0或更高。 –