Android sqlite database null pointer exception quando realiza Insert

18 respostas
DaianeMira

Eu estou iniciando em android, e estou tendo um problema com Null Pointer Exception quando eu tento inserir/ realizar um cadastro no banco de dados do Sqlite (Personal expert).

Espero que possam me ajudar

Meu codigo

public class DbAdapter {

	private static final String DBNAME = "banco_de_dados";
	private static final String DATABASE_TABLE = "Medicamento";
	private static final int DATABASE_VERSION = 1;

	public static final String KEY_NOME_MEDICAMENTO = "nome_medicamento";
	public static final String KEY_FORMA_FARMACEUTICA = "forma_farmaceutica";
	public static final String KEY_VIAS_ADMINISTRACAO = "vias_administracao";
	public static final String KEY_ROWID = "_id";

	public DatabaseHelper mDHelper;
	public SQLiteDatabase mDb;

	private static final String DATABASE_CREATE = "create table"
			+ DATABASE_TABLE + "(" + KEY_ROWID
			+ "integer primary key autoincrement, " + KEY_NOME_MEDICAMENTO
			+ "text not null, " + KEY_FORMA_FARMACEUTICA + "text not null, "
			+ KEY_VIAS_ADMINISTRACAO + "text not null);";

	private final Context mCtx;

	public DbAdapter(Context ctx) {
		this.mCtx = ctx;
	}

	public DbAdapter open() throws SQLException {
		mDHelper = new DatabaseHelper(mCtx);
		mDb = mDHelper.getWritableDatabase();
		return this;

	}

	public  void close() {
		mDHelper.close();
	}

	public long createDb(String nome_medicamento, String vias_administracao,
			String forma_farmaceutica) {
		ContentValues initialValues = new ContentValues();
		initialValues.put(KEY_NOME_MEDICAMENTO, nome_medicamento);
		initialValues.put(KEY_FORMA_FARMACEUTICA, forma_farmaceutica);
		initialValues.put(KEY_VIAS_ADMINISTRACAO, vias_administracao);

		return mDb.insert(DATABASE_TABLE, null, initialValues);

	}

	public boolean deleteDb(long rowId) {
		return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;

	}

	public boolean updateDb(long rowId, String nome_medicamento,
			String forma_farmaceutica, String vias_administracao) {
		ContentValues args = new ContentValues();
		args.put(KEY_NOME_MEDICAMENTO, nome_medicamento);
		args.put(KEY_FORMA_FARMACEUTICA, forma_farmaceutica);
		args.put(KEY_VIAS_ADMINISTRACAO, vias_administracao);

		return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
	}

	public Cursor fetchAllMedicamentos() {
		return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID,
				KEY_NOME_MEDICAMENTO, KEY_FORMA_FARMACEUTICA,
				KEY_VIAS_ADMINISTRACAO }, null, null, null, null, null);
	}

	public Cursor fetchMedicamentos(long rowId) throws SQLException {
		Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {
				KEY_ROWID, KEY_NOME_MEDICAMENTO, KEY_FORMA_FARMACEUTICA,
				KEY_VIAS_ADMINISTRACAO }, KEY_ROWID + "=" + rowId, null, null,
				null, null, null);
		
		if (mCursor != null) {mCursor.moveToFirst();
		}
		
		return mCursor;
		}
	

	private static class DatabaseHelper extends SQLiteOpenHelper {

		public DatabaseHelper(Context context) {
			super(context, DBNAME, null, DATABASE_VERSION);

		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE);

		}

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

		}

	}

}
public class RemedioAdd extends Activity {

	private Button createMedicine;
	private EditText mNomeMedicamento;
	private EditText mFormaFarmaceutica;
	private EditText mViasDeAdministracao;

	private Long mRowId;
	private DbAdapter mDHelper;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_remedio_add);

		mDHelper = new DbAdapter(this);
		
		mNomeMedicamento = (EditText) findViewById(R.id.editText1);
		mFormaFarmaceutica = (EditText) findViewById(R.id.editText2);
		mViasDeAdministracao = (EditText) findViewById(R.id.editText3);

		createMedicine = (Button) findViewById(R.id.button1);

		mRowId = savedInstanceState != null ? savedInstanceState
				.getLong(DbAdapter.KEY_ROWID) : null;

		registerButtonListenersAndSetDefaultText();

	}

	private void registerButtonListenersAndSetDefaultText() {

	
	createMedicine.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				mDHelper.open();
				saveState();
				setResult(RESULT_OK);
				Toast.makeText(RemedioAdd.this,
						getString(R.string.hello_world),
						Toast.LENGTH_SHORT).show();
				mDHelper.close();
				finish();
			}

		});

	}
	private void setRowIdFromIntent() {
		if (mRowId == null) {
			Bundle extras = getIntent().getExtras();
			mRowId = extras != null ? extras.getLong(DbAdapter.KEY_ROWID)
					: null;

		}
	}

	protected void onPause() {
		super.onPause();
		mDHelper.close();
	}

	protected void onResume() {
		super.onResume();
		mDHelper.open();
		setRowIdFromIntent();
		populateFields();
	}

	@SuppressWarnings("deprecation")
	private void populateFields() {
		if (mRowId != null) {
			Cursor medicamento = mDHelper.fetchMedicamentos(mRowId);
			startManagingCursor(medicamento);
			mNomeMedicamento.setText(medicamento.getString(medicamento
					.getColumnIndexOrThrow(DbAdapter.KEY_NOME_MEDICAMENTO)));
			mFormaFarmaceutica.setText(medicamento.getString(medicamento
					.getColumnIndexOrThrow(DbAdapter.KEY_FORMA_FARMACEUTICA)));
			mViasDeAdministracao.setText(medicamento.getString(medicamento
					.getColumnIndexOrThrow(DbAdapter.KEY_VIAS_ADMINISTRACAO)));
			medicamento.close();

		}
	}

	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putLong(DbAdapter.KEY_ROWID, mRowId);

	}

	private void saveState() {
		String nomeMedicamento = mNomeMedicamento.getText().toString();
		String formaFarmaceutica = mFormaFarmaceutica.getText().toString();
		String viasDeAdministracao = mViasDeAdministracao.getText().toString();

		if (mRowId == null) {
			Long id = mDHelper.createDb(nomeMedicamento, viasDeAdministracao,
					formaFarmaceutica);
			if (id > 0) {
				mRowId = id;
			}

		} else {
			mDHelper.updateDb(mRowId, nomeMedicamento, formaFarmaceutica,
					viasDeAdministracao);
		}
	}

O ERRO mostra que esta no metodo private void registerButtonListenersAndSetDefaultText() {

Estava acompanhando pelo Android for Dummies.

18 Respostas

R

em qual linha dá o NullPointerException?

DaianeMira

O Log

04-11 02:51:25.659: E/AndroidRuntime(303): FATAL EXCEPTION: main 04-11 02:51:25.659: E/AndroidRuntime(303): java.lang.RuntimeException: Unable to start activity ComponentInfo{ld.tcc.pontualmed/ld.tcc.pontualmed.RemedioAdd}: java.lang.NullPointerException 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.os.Handler.dispatchMessage(Handler.java:99) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.os.Looper.loop(Looper.java:123) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.ActivityThread.main(ActivityThread.java:4627) 04-11 02:51:25.659: E/AndroidRuntime(303): at java.lang.reflect.Method.invokeNative(Native Method) 04-11 02:51:25.659: E/AndroidRuntime(303): at java.lang.reflect.Method.invoke(Method.java:521) 04-11 02:51:25.659: E/AndroidRuntime(303): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-11 02:51:25.659: E/AndroidRuntime(303): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-11 02:51:25.659: E/AndroidRuntime(303): at dalvik.system.NativeStart.main(Native Method) 04-11 02:51:25.659: E/AndroidRuntime(303): Caused by: java.lang.NullPointerException 04-11 02:51:25.659: E/AndroidRuntime(303): at ld.tcc.pontualmed.RemedioAdd.registerButtonListenersAndSetDefaultText(RemedioAdd.java:45) 04-11 02:51:25.659: E/AndroidRuntime(303): at ld.tcc.pontualmed.RemedioAdd.onCreate(RemedioAdd.java:38) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-11 02:51:25.659: E/AndroidRuntime(303): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 04-11 02:51:25.659: E/AndroidRuntime(303): ... 11 more

DaianeMira

Nesse metodo da o erro

private void registerButtonListenersAndSetDefaultText() {  
  
      
    createMedicine.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View view) {  
                mDHelper.open();  
                saveState();  
                setResult(RESULT_OK);  
                Toast.makeText(RemedioAdd.this,  
                        getString(R.string.hello_world),  
                        Toast.LENGTH_SHORT).show();  
                mDHelper.close();  
                finish();  
            }  
  
        });  
  
    }
R

verifica no seu método saveState se as strings nomeMedicamento , formaFarmaceutica e viasDeAdministracao estão sendo preenchidas , antes você inserir no banco você deveria validar os dados se eles estão vazios ou não. Mais uma dica ao invés de utilizar os atributos nomeMedicamento , formaFarmaceutica e viasDeAdministracao você poderia definir uma classe medicamento que encapsula esses atributos.

DaianeMira

Como eu posso fazer para verificar se os dados estão vazios ou não?

R

usa esse método para testar sua string:

if(TextUtils.isEmpty(nomeMedicamento.trim())){
// mostra mensagem não pode ser vazio
}else{
// faz algo
}
Marky.Vasconcelos

Eh no onCreate que acontece certo? A aplicação nem abre.

createMedicine existe?

DaianeMira

Existe sim , é criado la em cima

è isso que vc perguntou?

Quando roda o aplicativo ele realmente abre mas nao entra na tela de criação

DaianeMira
createMedicine = (Button) findViewById(R.id.button1);

Ahh e aqui tbm, aqui eh qnd ele assume o valor do button1

DaianeMira

Ramon Pires as variaveis não estão vazias

R

qual que é código que está na linha 38 especificamente?

DaianeMira

registerButtonListenersAndSetDefaultText();

e nesse metodo:
private void saveState() {  
        String nomeMedicamento = mNomeMedicamento.getText().toString();  
        String formaFarmaceutica = mFormaFarmaceutica.getText().toString();  
        String viasDeAdministracao = mViasDeAdministracao.getText().toString();  
  
        if (mRowId == null) {  
            Long id = mDHelper.createDb(nomeMedicamento, viasDeAdministracao,  
                    formaFarmaceutica);  
            if (id > 0) {  
                mRowId = id;  
            }  
  
        } else {  
            mDHelper.updateDb(mRowId, nomeMedicamento, formaFarmaceutica,  
                    viasDeAdministracao);  
        }  
    }

Vc ve algo errado?

Porque quando tira a chamada dele, a tela abre mas nao salva.

R

eu quero saber como que é a linha de código que está linha 38.

DaianeMira

Na linha 38 está este codigo

registerButtonListenersAndSetDefaultText();

R

Verifica se chegar a entrar no método createDb , pra fazer isso você adiciona no inicio do seu método essa linha:

DaianeMira

Apareceu no log sim, deu que o erro está nesses metodos

Esse no RemediAdd
private void saveState() {  
        String nomeMedicamento = mNomeMedicamento.getText().toString();  
        String formaFarmaceutica = mFormaFarmaceutica.getText().toString();  
        String viasDeAdministracao = mViasDeAdministracao.getText().toString();  
  
        if (mRowId == null) {  
            Long id = mDHelper.createDb(nomeMedicamento, viasDeAdministracao,  
                    formaFarmaceutica);  
            if (id > 0) {  
                mRowId = id;  
            }  
  
        } else {  
            mDHelper.updateDb(mRowId, nomeMedicamento, formaFarmaceutica,  
                    viasDeAdministracao);  
        }  
    }
e esse no DbAdapter
public long createDb(String nome_medicamento, String vias_administracao,  
            String forma_farmaceutica) {  
        ContentValues initialValues = new ContentValues();  
        initialValues.put(KEY_NOME_MEDICAMENTO, nome_medicamento);  
        initialValues.put(KEY_FORMA_FARMACEUTICA, forma_farmaceutica);  
        initialValues.put(KEY_VIAS_ADMINISTRACAO, vias_administracao);  
  
        return mDb.insert(DATABASE_TABLE, null, initialValues);  
  
    }
DaianeMira

Eu testei tbm as Strings String nomeMedicamento, String formaFarmaceutica e String viasDeAdministracao e elas não estão nulas.

DaianeMira

Mais alguem?

Criado 11 de abril de 2013
Ultima resposta 14 de abr. de 2013
Respostas 18
Participantes 3