0

I'm building a aplication but when i try write data in there, show the error in the log.

Class ActCadContatos.java

package com.example.gabrielgomes.agendacontact;

import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.*;
import android.widget.*;

import com.example.gabrielgomes.agendacontact.database.DataBase;
import com.example.gabrielgomes.agendacontact.dominio.RepositorioContato;
import com.example.gabrielgomes.agendacontact.dominio.entidades.Contato;

import java.util.Date;

public class ActCadContatos extends AppCompatActivity {

    private EditText edtNome;
    private EditText edtTelefone;
    private EditText edtEmail;
    private EditText edtEndereco;
    private EditText edtDatasEspeciais;
    private EditText edtGrupos;

    private Spinner spnTipoTelefone;
    private Spinner spnTipoEmail;
    private Spinner spnTipoEndereco;
    private Spinner spnDatasEspeciais;

    //ArrayAdapter for save the options of the Spinner
    private ArrayAdapter<String> adpTipoEmail;
    private ArrayAdapter<String> adpTipoTelefone;
    private ArrayAdapter<String> adpTipoEndereco;
    private ArrayAdapter<String> adpTipoDatasEspeciais;

    //Objects for connection database
    private DataBase dataBase;
    private SQLiteDatabase conn;
    private RepositorioContato repositorioContato;
    private Contato contato;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_cad_contatos);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        edtNome = (EditText)findViewById(R.id.edtNome);
        edtTelefone = (EditText)findViewById(R.id.edtTelefone);
        edtEmail = (EditText)findViewById(R.id.edtEmail);
        edtEndereco = (EditText)findViewById(R.id.edtEndereco);
        edtDatasEspeciais = (EditText)findViewById(R.id.edtDatasEspeciais);
        edtGrupos = (EditText)findViewById(R.id.edtGrupos);

        spnTipoTelefone = (Spinner)findViewById(R.id.spnTipoTelefone);
        spnTipoEndereco = (Spinner)findViewById(R.id.spnTipoEndereco);
        spnTipoEmail = (Spinner)findViewById(R.id.spnTipoEmail);
        spnDatasEspeciais = (Spinner)findViewById(R.id.spnDatasEspeciais);

        //Recovering the ArrayAdapter's
        adpTipoEmail = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adpTipoEmail.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adpTipoEndereco = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adpTipoEndereco.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adpTipoTelefone = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adpTipoTelefone.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adpTipoDatasEspeciais = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adpTipoDatasEspeciais.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        //Connect object kind Spinner in a ArrayAdapter
        spnTipoEmail.setAdapter(adpTipoEmail);
        spnTipoEndereco.setAdapter(adpTipoEndereco);
        spnTipoTelefone.setAdapter(adpTipoTelefone);
        spnDatasEspeciais.setAdapter(adpTipoDatasEspeciais);

        //Add option in the ArrayAdapter for put in the Spinner
        adpTipoEmail.add("Pessoal");
        adpTipoEmail.add("Trabalho");
        adpTipoEmail.add("Outros");

        adpTipoTelefone.add("Casa");
        adpTipoTelefone.add("Trabalho");

        adpTipoEndereco.add("Casa");
        adpTipoEndereco.add("Trabalho");
        adpTipoEndereco.add("Outros");

        adpTipoDatasEspeciais.add("Aniversário");
        adpTipoDatasEspeciais.add("Namoro");
        adpTipoDatasEspeciais.add("Casamento");

        //Connection to database
        try {

            //dataBase comes to Class "Database" that create and upgrade the tables
            dataBase = new DataBase(this);
            //conn comes SQLiteDatabase Class it's Android default
            conn = dataBase.getWritableDatabase();
            //repositorioContato is where we sent the datas for input the database
            RepositorioContato repositorioContato = new RepositorioContato(conn);

        } catch (SQLException e){

            AlertDialog.Builder dlg = new AlertDialog.Builder(this);
            dlg.setMessage("Error to connect: " + e.getMessage());
            dlg.setNeutralButton("OK", null);
            dlg.show();

        }

    }

    //Method for create the menu and connect This with menu.xml
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_act_cad_contato, menu);

        return super.onCreateOptionsMenu(menu);

    }

    //Method for create the action menu for regitry
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()){

            case R.id.mni_acao1:

                //why?
                if (contato == null){

                    inserir();
                }

                finish();

                break;
            case R.id.mni_acao2:
                break;

        }

        return super.onOptionsItemSelected(item);
    }

    //Method for insert datas of the activity for the database altrought get and setter
    private void inserir(){

        try {

            contato = new Contato();
            contato.setNome(edtNome.getText().toString());
            contato.setTelefone(edtTelefone.getText().toString());
            contato.setTipoTelefone("");
            contato.setEmail(edtEmail.getText().toString());
            contato.setTipoEmail("");
            contato.setEndereco(edtEndereco.getText().toString());
            contato.setTipoEndereco("");
            Date date = new Date();
            contato.setDatasEspeciais(date);
            contato.setTipoDatasEspeciais("");
            contato.setGrupos(edtGrupos.getText().toString());
            repositorioContato.inserir(contato);

        } catch (SQLException e){

            AlertDialog.Builder dlg = new AlertDialog.Builder(this);
            dlg.setMessage("Error to insert the datas: " + e.getMessage());
            dlg.setNeutralButton("OK", null);
            dlg.show();

        }

    }

}

Database Class

    package com.example.gabrielgomes.agendacontact.database;

    import android.content.Context;
    import android.database.sqlite.*;

    /**
     * Created by Gabriel Gomes on 31/07/2016.
     */

//Class responsable by create Database, SQLiteOpenHelper just be extends
public class DataBase extends SQLiteOpenHelper {

    //Constructor
    public DataBase(Context context){
        //Context, database name, null, version of schema
        super(context, "AGENDA", null, 1);

    }

    //Create table
    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(ScriptSQL.getCreateContato());

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {



    }
}

Script Class

package com.example.gabrielgomes.agendacontact.database;

/**
 * Created by Gabriel Gomes on 31/07/2016.
 */

//Class for script SQL
public class ScriptSQL {

    //Static method, don't need instace for access it
    public static String getCreateContato(){

        StringBuilder sqlBuilder = new StringBuilder();
        sqlBuilder.append("CREATE TABLE IF NOT EXISTS CONTATO ( ");
        sqlBuilder.append("_id INTEGER NOT NULL ");
        sqlBuilder.append("PRIMARY KEY AUTOINCREMENT, ");
        //sqlBuilder.append("NOME VARCHAR (200), ");
        sqlBuilder.append("TELEFONE VARCHAR (14), ");
        sqlBuilder.append("TIPOTELEFONE VARCHAR (1), ");
        sqlBuilder.append("EMAIL VARCHAR (255), ");
        sqlBuilder.append("TIPOEMAIL VARCHAR (1), ");
        sqlBuilder.append("ENDERECO VARCHAR (255), ");
        sqlBuilder.append("TIPOENDERECO VARCHAR (1), ");
        sqlBuilder.append("DATASESPECIAIS DATE, ");
        sqlBuilder.append("TIPODATASESPECIAIS VARCHAR (1), ");
        sqlBuilder.append("GRUPOS VARCHAR (255) ");
        sqlBuilder.append(");");

        return sqlBuilder.toString();

    }

}

Repositorio Class

package com.example.gabrielgomes.agendacontact.dominio;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.*;
import android.widget.ArrayAdapter;

import com.example.gabrielgomes.agendacontact.R;
import com.example.gabrielgomes.agendacontact.dominio.entidades.Contato;

/**
 * Created by Gabriel Gomes on 31/07/2016.
 */

//Class responsible for realize get the data in the content view, consulting in the database, and return the object Array to fill ListView
public class RepositorioContato {

    private SQLiteDatabase conn;

    //Constructor
    public RepositorioContato(SQLiteDatabase conn){

        this.conn = conn;

    }

    //Method for insert datas of the activity in the database
    public void inserir(Contato contato){

        ContentValues values = new ContentValues();
        values.put("NOME", contato.getNome());
        values.put("TELEFONE", contato.getTelefone());
        values.put("TIPOTELEFONE", contato.getTipoTelefone());
        values.put("EMAIL", contato.getEmail());
        values.put("TIPOEMAIL", contato.getTipoEmail());
        values.put("ENDERECO", contato.getEndereco());
        values.put("TIPOENDERECO", contato.getTipoEndereco());
        values.put("DATASESPECIAIS", contato.getDatasEspeciais().getTime());
        values.put("TIPODATASESPECIAIS", contato.getTipoDatasEspeciais());
        values.put("GRUPOS", contato.getGrupos());
        conn.insertOrThrow("CONTATO", null, values);
    }
    //Atention: atribute bellow is kind date, so it's need the .getTime() method.

    //Test for insert datas
    /*public void testInserirContatos(){

        for (int i=0; i<10; i++){

            //For insert datas in the database
            ContentValues values = new ContentValues();
            values.put("TELEFONE", "5555555");
            //name table, null, values.put
            conn.insertOrThrow("CONTATO", null, values);

        }

    }*/

    //This method make the search and save all datas of the table on the Array
    public ArrayAdapter<String> buscaContatos(Context context){

        ArrayAdapter<String> adpContatos = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1);

        //Save all resgitry   //.query - Method for consulting: table name,
        Cursor cursor = conn.query("CONTATO", null, null, null, null, null, null);

        //If content of cursor have data more 0, fill ArrayAdapter with cursor data
        if (cursor.getCount() > 0) {

            //Move cursor to first data of the Array
            cursor.moveToFirst();

            //Loop for take all registry if have it
            do {
                //getString catch the index column
                String telefone = cursor.getString(1);
                adpContatos.add(telefone);

            } while (cursor.moveToNext());

        }

        return adpContatos;

    }

}

content_act_cad_contato.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.gabrielgomes.agendacontact.ActCadContatos"
    tools:showIn="@layout/activity_act_cad_contatos"
    android:orientation="vertical">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lnlCampoNome">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lbl_Nome"
            android:id="@+id/textView" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/edtNome" />

    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lnlCampoTelefone">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lbl_Telefone"
            android:id="@+id/textView2" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:inputType="phone"
                android:ems="10"
                android:id="@+id/edtTelefone" />

            <Spinner
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:id="@+id/spnTipoTelefone" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lnlCampoEmail">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lbl_Email"
            android:id="@+id/textView3" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:id="@+id/edtEmail"
                android:inputType="textEmailAddress" />

            <Spinner
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:id="@+id/spnTipoEmail" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lnlCampoEndereco">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lbl_Endereco"
            android:id="@+id/textView4" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:id="@+id/edtEndereco"
                android:inputType="textPersonName" />

            <Spinner
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:id="@+id/spnTipoEndereco" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lnlCampoDatasEspeciais">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lbl_Datas_Especiais"
            android:id="@+id/textView5" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:id="@+id/edtDatasEspeciais"
                android:inputType="date" />

            <Spinner
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:id="@+id/spnDatasEspeciais" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lnlGrupo">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/lbl_Grupos"
            android:id="@+id/textView6" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:id="@+id/edtGrupos"
                android:inputType="textPersonName" />

        </LinearLayout>
    </LinearLayout>

</LinearLayout>

LOG:

08-06 16:35:22.832 2268-2268/com.example.gabrielgomes.agendacontact E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.gabrielgomes.agendacontact, PID: 2268 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.gabrielgomes.agendacontact.dominio.RepositorioContato.inserir(com.example.gabrielgomes.agendacontact.dominio.entidades.Contato)' on a null object reference at com.example.gabrielgomes.agendacontact.ActCadContatos.inserir(ActCadContatos.java:183) at com.example.gabrielgomes.agendacontact.ActCadContatos.onOptionsItemSelected(ActCadContatos.java:152) at android.app.Activity.onMenuItemSelected(Activity.java:2885) at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:404) at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:179) at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100) at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100) at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:69) at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:169) at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:760) at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948) at android.support.v7.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:191) at android.widget.AdapterView.performItemClick(AdapterView.java:305) at android.widget.AbsListView.performItemClick(AbsListView.java:1146) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053) at android.widget.AbsListView$3.run(AbsListView.java:3860) 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:5254) 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:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 08-06 16:35:25.308 2268-2268/com.example.gabrielgomes.agendacontact I/Process: Sending signal. PID: 2268 SIG: 9 08-06 16:35:27.992 4214-4239/com.example.gabrielgomes.agendacontact D/OpenGLRenderer: endAllStagingAnimators on 0x7fe895d4a400 (RippleDrawable) with handle 0x7fe895c7f5a0 08-06 16:36:56.285 4214-4222/com.example.gabrielgomes.agendacontact W/art: Suspending all threads took: 7.399ms 08-06 16:38:36.537 4214-4222/com.example.gabrielgomes.agendacontact W/art: Suspending all threads took: 9.017ms 08-06 16:43:31.304 4214-4222/com.example.gabrielgomes.agendacontact W/art: Suspending all threads took: 5.852ms 08-06 16:43:37.818 4214-4222/com.example.gabrielgomes.agendacontact W/art: Suspending all threads took: 8.820ms

Gabriel Gomes
  • 139
  • 1
  • 3
  • 20
  • 3
    its a null object reference... have a debugger and check whether you are passing right value also check y is your object null.. – Moulesh Aug 06 '16 at 17:24
  • You're calling `finish()` in `ActCadContatos` class rightafter calling `inserir()`. Maybe thats causing trouble. – Shaishav Aug 06 '16 at 17:25

1 Answers1

0

See below, you have declared

RepositorioContato repositorioContato;

here:

enter image description here

Now as we know about concept of "scope". Below you are again creating and initializing (in this scope i.e try block {}) the same reference "repositorioContato"

RepositorioContato repositorioContato = new RepositorioContato(conn);

here:

enter image description here

So when you call the

enter image description here

It will access the top most reference (which will be null, because try block scope will not be accessible here...)

Hope I made clear, if any problem still persistes, feel free to ask :)

ashishdhiman2007
  • 807
  • 2
  • 13
  • 28