2016-09-24 5 views
0

Я пытаюсь вернуть объект из базы данных firebase по его идентификатору. Но мое приложение падает с исключительным исключением. Пожалуйста, помогите мне. Я новичок в 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"); 
            } 
           } 

Здесь размещается содержание моего логарифма.

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

Исправлено. Мой запрос был неправильным. Хотя исправление запроса по-прежнему не приведет к тому, что listview отобразит полученный результат. Я использовал адаптер списка 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, результатом будет список элементов. Даже если для вашего запроса имеется только одно совпадение, результатом будет список из них. Так что ваш код должен обрабатывать список, обернув над 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 или выше. –

Смежные вопросы