Código estava rolando, agora após a última migration começou a dar NULLPOINTER.
https://github.com/neji-hyuga/display_contacts_app
se alguém puder me dar um retorno vai ser bem bacana, valeu!"
Código estava rolando, agora após a última migration começou a dar NULLPOINTER.
https://github.com/neji-hyuga/display_contacts_app
se alguém puder me dar um retorno vai ser bem bacana, valeu!"
Faz o seguinte, Victor, roda o app e posta a StackTrace do erro (que aparece no Logcat) aqui pra gente te ajudar.
Segue Felipe, vlw.
2020-05-27 17:08:00.215 17394-17394/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.alura.displaycontactsapp, PID: 17394
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.alura.displaycontactsapp.model.Phone.getNumber()' on a null object reference
at com.alura.displaycontactsapp.ui.adapter.StudentListAdapter.joinsInformation(StudentListAdapter.java:59)
at com.alura.displaycontactsapp.ui.adapter.StudentListAdapter.getView(StudentListAdapter.java:50)
at android.widget.AbsListView.obtainView(AbsListView.java:2370)
at android.widget.ListView.makeAndAddView(ListView.java:1970)
at android.widget.ListView.fillDown(ListView.java:704)
at android.widget.ListView.fillFromTop(ListView.java:765)
at android.widget.ListView.layoutChildren(ListView.java:1716)
at android.widget.AbsListView.onLayout(AbsListView.java:2162)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:726)
at android.view.View.layout(View.java:17653)
at android.view.ViewGroup.layout(ViewGroup.java:5579)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2364)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1272)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6408)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
at android.view.Choreographer.doCallbacks(Choreographer.java:686)
at android.view.Choreographer.doFrame(Choreographer.java:621)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Pela stacktrace, vemos que há um problema na linha 59 do StudentListAdapter
ao fazer .getNumber()
num objeto do tipo Phone
, que está nulo:
Attempt to invoke virtual method 'java.lang.String com.alura.displaycontactsapp.model.Phone.getNumber()' on a null object reference
at com.alura.displaycontactsapp.ui.adapter.StudentListAdapter.joinsInformation(StudentListAdapter.java:59)
Olhando essa linha, temos:
phone.setText(firstPhone.getNumber());
De acordo com o erro, essa variável firstPhone
está nula, mas de onde ela vem? Temos logo acima a seguinte linha:
Phone firstPhone = dao.searchFirstStudentPhone(studentSelected.getId());
Então, está vindo de uma busca no banco. Vamos ver o que o método do dao
faz:
@Query("SELECT * FROM Phone WHERE studentId = :studentId LIMIT 1")
Phone searchFirstStudentPhone(int studentId);
Aqui está tudo certo, então concluímos que esse não há um phone para esse studentId e, por isso ele retorna nulo. Porém, como esse erro apareceu após uma migration, vamos olhar como está essa tabela Phone
:
Na linha 83 do ContactsMigrations
temos:
database.execSQL("INSERT INTO Phone (phone, id)" +
"SELECT phone, id FROM Student");
Aqui temos algo estranho: veja que você está inserindo no id do Phone
o id do Student
. Porém esse id do Phone
é Autoincrement, na realidade você deve inserir o id do Student no campo studentId do Phone, assim:
database.execSQL("INSERT INTO Phone (phone, studentId)" +
"SELECT phone, id FROM Student");
Bônus: na linha 86 dessa mesma ContactsMigrations
há um erro de digitação (phone está minúsculo e deveria ser Phone), assim:
database.execSQL("UPDATE Phone SET typePhone =?", new TypePhoneNumber[] {HOME});