2016-09-24 5 views
0

私のfirebaseデータベースからオブジェクトを取得しようとしています。しかし、私のアプリはnullポインタの例外でクラッシュします。私を助けてください。私はFirebaseを初めて使う人です。 また、検索がうまくいかないかどうか調べる方法を知りたいと思います。 Here's my database contentsAndroid/Firebase:クエリのonDataChange()がnullポインタ例外を返します。

これは私のコードのデータ収集です。 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リストアダプタを使用しました。誰かを助けるなら、私は下に正しいコードを掲示しました。みんな、ありがとう。

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データベースに対してクエリを実行すると、結果はアイテムのリストになります。クエリに一致するものが1つしかない場合でも、結果は1つのリストになります。だからあなたのコードが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以上でなければなりません。 –

関連する問題