Android - 在新的SQLiteOpenHelper子实例发生时获取NullPointerException

时间:2016-04-15 02:19:04

标签: android sql database sqlite nullpointerexception

SQLiteCreate扩展SQLiteOpenHelper以创建数据库,SQLiteController来控制值。在调试中,当我创建SQLiteController的对象时,我发现SQLiteController构造函数中的变量“banco”正在获得NULL

SQLiteCreate类:

package din.uem.ajudaamao.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLiteCreate extends SQLiteOpenHelper {

    public static final int VERSAO = 1;

    public static final String NOME_BANCO = "database.db";
    public static final String TABELA = "contatos";
    public static final String ID = "_id";
    public static final String NOME = "nome";
    public static final String NUMERO = "numero";
    public static final String MENSAGEM = "mensagem";
    public static final String TIPO = "tipo";

    public SQLiteCreate(Context context) {
        super(context, NOME_BANCO, null, VERSAO);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABELA + " ("
                + ID        + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + NOME      + " TEXT, "
                + NUMERO    + " TEXT, "
                + MENSAGEM  + " TEXT, "
                + TIPO      + " TEXT)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABELA);
        onCreate(db);
    }

}

SQLiteController类:

package din.uem.ajudaamao.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import din.uem.ajudaamao.classes.Contato;

public class SQLiteController {

    private SQLiteDatabase db;
    private SQLiteCreate banco;

    public SQLiteController(Context context) {
        banco = new SQLiteCreate(context);
    }

    public String insereDado(Contato contato) {

        db = banco.getWritableDatabase();
        ContentValues valores = new ContentValues();
        valores.put(SQLiteCreate.NOME, contato.name);
        valores.put(SQLiteCreate.MENSAGEM, contato.message);
        valores.put(SQLiteCreate.NUMERO, contato.phoneNumber);
        valores.put(SQLiteCreate.TIPO, contato.getType());

        long resultado = db.insert(SQLiteCreate.TABELA, null, valores);
        db.close();

        if (resultado == -1)
            return "Erro ao inserir registro";
        else
            return "Registro inserido com sucesso";

}

    public Cursor carregaDados() { // NOT IN USE SO FAR
        Cursor cursor;
        String[] campos = {SQLiteCreate.ID, SQLiteCreate.NOME};
        db = banco.getReadableDatabase();
        cursor = db.query(SQLiteCreate.TABELA, campos, null, null, null, null, null, null);

        if (cursor != null)
            cursor.moveToFirst();
        db.close();

        return cursor;
    }

}

我尝试创建对象的类(在addContato方法中)

    package din.uem.ajudaamao.activities;

    imports...

    public class ContatosActivity extends AppCompatActivity {

    TabHost host;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contatos);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Contatos");

    // -------------------------------- TAB CONFIG ---------------------------------------------- //
        host = (TabHost)findViewById(R.id.tabHost);
        host.setup();

        // Tab 1
        TabHost.TabSpec spec = host.newTabSpec("Emergência");
        spec.setContent(R.id.tabEmergencia);
        spec.setIndicator("Emergência");

        host.addTab(spec);

        //Tab 2
        spec = host.newTabSpec("Atenção");
        spec.setContent(R.id.tabAtencao);
        spec.setIndicator("Urgente");
        host.addTab(spec);

        //Tab 3
        spec = host.newTabSpec("Não Urgente");
        spec.setContent(R.id.tabNaoUrgente);
        spec.setIndicator("Não Urgente");
        host.addTab(spec);
    // ------------------------------ TAB CONFIG END -------------------------------------------- //

    // --------------------------- setOnClickListener --------------------------------------------//

        final ListView lvContatosEmergencia = (ListView)findViewById(R.id.lvContatosEmergencia);
        lvContatosEmergencia.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent itContatoInfo = new Intent(ContatosActivity.this, ContatoInfo.class);
                itContatoInfo.putExtra("position", position);
                itContatoInfo.putExtra("type", Contato.EMERGENCIA);
                startActivity(itContatoInfo);
            }
        });

        final ListView lvContatosAtencao = (ListView)findViewById(R.id.lvContatosAtencao);
        lvContatosAtencao.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent itContatoInfo = new Intent(ContatosActivity.this, ContatoInfo.class);
                itContatoInfo.putExtra("position", position);
                itContatoInfo.putExtra("type", Contato.ATENCAO);
                startActivity(itContatoInfo);
            }
        });

        final ListView lvContatosNaoUrgente = (ListView)findViewById(R.id.lvContatosNaoUrgente);
        lvContatosNaoUrgente.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent itContatoInfo = new Intent(ContatosActivity.this, ContatoInfo.class);
                itContatoInfo.putExtra("position", position);
                itContatoInfo.putExtra("type", Contato.NAO_URGENTE);
                startActivity(itContatoInfo);
            }
        });
    // --------------------------- END OnClickListener -------------------------------------------//

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.contatos_menu, menu);
        return true;
    }

    public void addContato(Contato contato, int tipo) {
        if (tipo == Contato.EMERGENCIA) {
            EmergenciaFragment fragEmergencia = new EmergenciaFragment();
            fragEmergencia.addContato(contato);
        }
        else if(tipo == Contato.ATENCAO) {
            AtencaoFragment.addContato(contato);
        }
        else if(tipo == Contato.NAO_URGENTE) {
            NaoUrgenteFragment.addContato(contato);
        }
        SQLiteController controller = new SQLiteController(this);
        String resultado = controller.insereDado(contato);
    }

    public void showAddContatoDialog(final int tipo) {
        final Dialog dbAddContato = new Dialog(this);
        dbAddContato.setContentView(R.layout.dialogbox_add_contato);
        dbAddContato.setTitle("Adicionar Contato");

        Button dbbtAdd = (Button)dbAddContato.findViewById(R.id.btAdicionar);
        Button dbbtCancelar = (Button)dbAddContato.findViewById(R.id.btCancelar);

        dbbtCancelar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbAddContato.cancel();
            }
        });
        dbbtAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Contato contato = new Contato(tipo);

                EditText etNome = (EditText) dbAddContato.findViewById(R.id.etNome);
                EditText etNumero = (EditText) dbAddContato.findViewById(R.id.etNumero);
                EditText etDDD = (EditText) dbAddContato.findViewById(R.id.etDDD);
                EditText etMensagem = (EditText) dbAddContato.findViewById(R.id.etMensagem);

                if (etNome.getText().toString().isEmpty() || etDDD.getText().toString().isEmpty() || etNumero.getText().toString().isEmpty() || etMensagem.getText().toString().isEmpty()) {
                    Toast.makeText(getApplicationContext(), "Todos os campos devem ser preenchidos", Toast.LENGTH_SHORT).show();
                } else {
                    contato.name = etNome.getText().toString();
                    contato.phoneNumber = etNumero.getText().toString();
                    contato.message = etMensagem.getText().toString();

                    addContato(contato, tipo);
                    Toast.makeText(getApplicationContext(), "Contato Adicionardo", Toast.LENGTH_SHORT).show();

                    dbAddContato.cancel();
                }
            }
        });

        dbAddContato.show();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
            case R.id.action_add:
                Intent itAddContato = new Intent(this, AddContatoActivity.class);
                startActivity(itAddContato);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        Utility.refreshListView(Contato.EMERGENCIA);
        Utility.refreshListView(Contato.ATENCAO);
        Utility.refreshListView(Contato.NAO_URGENTE);

    }

}

错误日志

[enter image description here][1]FATAL EXCEPTION: main
                                                               Process: din.uem.ajudaamao, PID: 29880
                                                               java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
                                                                   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:269)
                                                                   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
                                                                   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
                                                                   at din.uem.ajudaamao.database.SQLiteController.insereDado(SQLiteController.java:21)
                                                                   at din.uem.ajudaamao.activities.ContatosActivity.addContato(ContatosActivity.java:125)
                                                                   at din.uem.ajudaamao.activities.AddContatoActivity.onOptionsItemSelected(AddContatoActivity.java:61)
                                                                   at android.app.Activity.onMenuItemSelected(Activity.java:2912)
                                                                   at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:404)
                                                                   at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:185)
                                                                   at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
                                                                   at android.support.v7.app.AppCompatDelegateImplV7.onMenuItemSelected(AppCompatDelegateImplV7.java:655)
                                                                   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.widget.ActionMenuView.invokeItem(ActionMenuView.java:618)
                                                                   at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139)
                                                                   at android.view.View.performClick(View.java:5201)
                                                                   at android.view.View$PerformClick.run(View.java:21163)
                                                                   at android.os.Handler.handleCallback(Handler.java:746)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                   at android.os.Looper.loop(Looper.java:148)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

http://i.stack.imgur.com/YLwPx.png

0 个答案:

没有答案