Android sqlite database null pointer exception quando realiza Insert

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

[code]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) {

	}

}

}[/code]

[code]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);
	}
}

[/code]

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

Estava acompanhando pelo Android for Dummies.

em qual linha dá o NullPointerException?

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

Nesse metodo da o erro

[code]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();  
        }  

    });  

}  [/code]

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.

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

usa esse método para testar sua string:

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

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

createMedicine existe?

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

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

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

Ramon Pires as variaveis não estão vazias

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

registerButtonListenersAndSetDefaultText();

e nesse metodo: [code]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);  
    }  
}  [/code]

Vc ve algo errado?

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

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

Na linha 38 está este codigo

registerButtonListenersAndSetDefaultText();

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

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

[code]

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);  

}  [/code]

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

Mais alguem?