Inserir dados no SQLite? [Resolvido]

Boa noite, estou seguindo um exemplo para gravar dados no SQLite dento do android, mais não esta dando certo. Segui todo o exemplo adaptando a minha necessidade, só que na hora de gravar da erro

O logcat

[quote]12-13 22:18:30.079: W/KeyCharacterMap(2433): No keyboard for id 0
12-13 22:18:30.079: W/KeyCharacterMap(2433): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
12-13 22:18:30.999: D/AndroidRuntime(2433): Shutting down VM
12-13 22:18:30.999: W/dalvikvm(2433): threadid=1: thread exiting with uncaught exception (group=0x40018578)
12-13 22:18:30.999: E/AndroidRuntime(2433): FATAL EXCEPTION: main
12-13 22:18:30.999: E/AndroidRuntime(2433): java.lang.NullPointerException
12-13 22:18:30.999: E/AndroidRuntime(2433): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.inserirConfig(ConfiguracoesEditarActivity.java:150)
12-13 22:18:30.999: E/AndroidRuntime(2433): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.access$2(ConfiguracoesEditarActivity.java:127)
12-13 22:18:30.999: E/AndroidRuntime(2433): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity$5.onClick(ConfiguracoesEditarActivity.java:122)
12-13 22:18:30.999: E/AndroidRuntime(2433): at android.view.View.performClick(View.java:2485)
12-13 22:18:30.999: E/AndroidRuntime(2433): at android.view.View$PerformClick.run(View.java:9080)
12-13 22:18:30.999: E/AndroidRuntime(2433): at android.os.Handler.handleCallback(Handler.java:587)
12-13 22:18:30.999: E/AndroidRuntime(2433): at android.os.Handler.dispatchMessage(Handler.java:92)
12-13 22:18:30.999: E/AndroidRuntime(2433): at android.os.Looper.loop(Looper.java:130)
12-13 22:18:30.999: E/AndroidRuntime(2433): at android.app.ActivityThread.main(ActivityThread.java:3687)
12-13 22:18:30.999: E/AndroidRuntime(2433): at java.lang.reflect.Method.invokeNative(Native Method)
12-13 22:18:30.999: E/AndroidRuntime(2433): at java.lang.reflect.Method.invoke(Method.java:507)
12-13 22:18:30.999: E/AndroidRuntime(2433): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-13 22:18:30.999: E/AndroidRuntime(2433): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-13 22:18:30.999: E/AndroidRuntime(2433): at dalvik.system.NativeStart.main(Native Method)
[/quote]

Vou postar todo o codigo pra ver se alguém pode dizer o que esta errado.

A classe databaseHelper

[code]package br.com.azsolucoes.azcomanda.utils;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;
import br.com.azsolucoes.azcomanda.pojo.Casa;

public class DatabaseHelper extends SQLiteOpenHelper {

private SQLiteDatabase db;
private SQLiteStatement insertCasas;

// tabelas e campos
public static final String TABLE_NAME = "casas";
public static final String ID = "_id";
public static final String DESCRICAO = "descricao";
public static final String SENHA = "senha";
public static final String IP = "ip";
public static final String PORTA = "posta";
// monta o create table
private static final String DATABASE_CREATE = "create table " + TABLE_NAME
		+ "( " + ID + " integer primary key autoincrement, " + DESCRICAO
		+ " text not null, " + SENHA + " text not null, " + IP
		+ " text not null" + ", " + PORTA + " integer);";


@Override
public void onCreate(SQLiteDatabase db) {
	db.execSQL(DATABASE_CREATE);
	Log.i("AZComanda", "Passou no oncreate da tabela");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	Log.w(DatabaseHelper.class.getName(), "Upgrading database from version "
			+ oldVersion + " to " + newVersion
			+ ", which will destroy all old data");
	db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
	onCreate(db);
}

// metodos insert
public DatabaseHelper(Context context, String name, CursorFactory factory,
		int version) {
	super(context, name, factory, version);
	this.db = getWritableDatabase();

	String insert = " INSERT INTO casas (descricao, senha, ip, porta) "
			+ " values(?, ?, ?, ?)";
	this.insertCasas = this.db.compileStatement(insert);

	// novos inserts definir aqui
}

public long inserirCasas(Casa casa) {
	insertCasas.bindString(1, casa.getDescricao());
	insertCasas.bindString(2, casa.getSenha());
	insertCasas.bindString(3, casa.getIp());
	insertCasas.bindLong(4, casa.getPorta());

	return insertCasas.executeInsert();
}

// metodo update
public int atualizarCasa(Casa casa) {
	ContentValues values = new ContentValues();
	values.put("descricao", casa.getDescricao());
	values.put("senha", casa.getSenha());
	values.put("ip", casa.getIp());
	values.put("porta", casa.getId());

	String whereClause = "id = ?";
	String[] whereArgs = new String[] { casa.getId() + "" };

	return this.db.update("Casas", values, whereClause, whereArgs);
}

private Casa cursorToCasa(Cursor c) {
	Casa casa = new Casa();
	casa.setId(c.getInt(0));
	casa.setDescricao(c.getString(1));
	casa.setSenha(c.getString(2));
	casa.setIp(c.getString(3));
	casa.setPorta(c.getInt(4));

	return casa;
}

public Casa getProdutoById(long id) {
	Casa casa = null;

	String query = "SELECT * FROM casas WHERE id = ?";
	Cursor c = db.rawQuery(query, new String[] { id + "" });
	if (c.moveToFirst())
		casa = cursorToCasa(c);

	return casa;
}

public List<Casa> listarTodasCasas() {
	List<Casa> lista;
	String query = " SELECT * FROM casas";
	Cursor c = db.rawQuery(query, null);

	lista = cursorListToListaCasas(c);

	return lista;
}

private List<Casa> cursorListToListaCasas(Cursor c) {
	List<Casa> lista = new ArrayList<Casa>();
	if (c.moveToFirst()) {

		do {
			lista.add(cursorToCasa(c));
		} while (c.moveToNext());
	}

	return lista;
}

}[/code]

a classe Casa

[code]package br.com.azsolucoes.azcomanda.pojo;

public class Casa {

private int id;
private String descricao;
private String senha;
private String ip;
private int porta;

public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public String getSenha() {
	return senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}

public String getIp() {
	return ip;
}

public void setIp(String ip) {
	this.ip = ip;
}

public int getPorta() {
	return porta;
}

public void setPorta(int porta) {
	this.porta = porta;
}

}
[/code]

A classe App

[code]package br.com.azsolucoes.azcomanda.activities;

import android.app.Application;
import br.com.azsolucoes.azcomanda.utils.DatabaseHelper;

public class App extends Application {
private DatabaseHelper databaseHelper;

public DatabaseHelper getDatabaseHelper() {
	return databaseHelper;
}

/** Nome do banco de dados **/	
private static final String NOME_BD = "azcomanda.db";

/**
 * A versão da base de dados. Cada vez que atualizar o onUpgrade da classe
 * DatabaseHelper deve alterar a versão aqui
 */
private static final int VERSAO_BD = 1;

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

	databaseHelper = new DatabaseHelper(this, NOME_BD, null, VERSAO_BD);
}

}
[/code]

E o método a aonde estou chamando

botao_salvar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { inserirConfig(); } });

[code]private void inserirConfig() {
String descricao = edt_descricao.getText().toString();
String senha = edt_senha.getText().toString();
String ip = edt_ip.getText().toString();
int porta = Integer.parseInt(edt_porta.getText().toString());

	if ((descricao.equals("")) || (senha.equals("")) || (ip.equals(""))
			|| (porta <= 0)) {
		Toast.makeText(this, getString(R.string.msg_preenchadados),
				Toast.LENGTH_LONG).show();
	} else {

		App app = new App(); //(App) getApplicationContext();
		Casa casa = new Casa();
		casa.setId(id);
		casa.setDescricao(descricao);
		casa.setSenha(senha);
		casa.setIp(ip);
		casa.setPorta(porta);
		
		// se a variavel for zero então insere, se não faz update
		if (id == 0) {
			app.getDatabaseHelper()
					.inserirCasas(casa);
		} else {
			int atualizou = app.getDatabaseHelper().atualizarCasa(
					casa);
			if (atualizou > 0) {
				Toast.makeText(this,
						getString(R.string.msg_configatualizada),
						Toast.LENGTH_SHORT).show();
			}
		}
	}

}

[/code]

Mais aqui nesta linha quando chama este metodo INSERIRCASAS

if (id == 0) { app.getDatabaseHelper() .inserirCasas(casa);

Aqui não esta funcionando

[code]public long inserirCasas(Casa casa) {
insertCasas.bindString(1, casa.getDescricao());
insertCasas.bindString(2, casa.getSenha());
insertCasas.bindString(3, casa.getIp());
insertCasas.bindLong(4, casa.getPorta());

	return insertCasas.executeInsert();
}[/code]

Mudei aqui também
O codigo original do exemplo era assim

Mais assim dava erro

Quando alterei assim

Passou nesta linha, mais ai gera o erro la aonde falei INSERIRCASAS

Obrigado a todos que me ajudarem.

Logicamente se você fizer esta alteração vai receber uma NullPointerException. A tua classe App inicializa o DatabaseHelper só no método onCreate. Mas se você faz isto (app = new App()), o método onCreate nunca será chamado e o databaseHelper será nulo.

Qual erro acontece quando você deixa do jeito anterior (app = (App) getApplicationContext()) ?

[quote=wagnerfrancisco][quote=adriano_servitec]
Mudei aqui também
O codigo original do exemplo era assim

Mais assim dava erro

Quando alterei assim

Passou nesta linha, mais ai gera o erro la aonde falei INSERIRCASAS

[/quote]

Logicamente se você fizer esta alteração vai receber uma NullPointerException. A tua classe App inicializa o DatabaseHelper só no método onCreate. Mas se você faz isto (app = new App()), o método onCreate nunca será chamado e o databaseHelper será nulo.

Qual erro acontece quando você deixa do jeito anterior (app = (App) getApplicationContext()) ?[/quote]Obrigado pela ajuda, então quando deixo na forma original da este erro

[quote]12-13 23:06:37.839: W/KeyCharacterMap(2683): No keyboard for id 0
12-13 23:06:37.839: W/KeyCharacterMap(2683): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
12-13 23:06:38.969: D/AndroidRuntime(2683): Shutting down VM
12-13 23:06:38.969: W/dalvikvm(2683): threadid=1: thread exiting with uncaught exception (group=0x40018578)
12-13 23:06:38.979: E/AndroidRuntime(2683): FATAL EXCEPTION: main
12-13 23:06:38.979: E/AndroidRuntime(2683): java.lang.ClassCastException: android.app.Application
12-13 23:06:38.979: E/AndroidRuntime(2683): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.inserirConfig(ConfiguracoesEditarActivity.java:139)
12-13 23:06:38.979: E/AndroidRuntime(2683): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.access$2(ConfiguracoesEditarActivity.java:127)
12-13 23:06:38.979: E/AndroidRuntime(2683): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity$5.onClick(ConfiguracoesEditarActivity.java:122)
12-13 23:06:38.979: E/AndroidRuntime(2683): at android.view.View.performClick(View.java:2485)
12-13 23:06:38.979: E/AndroidRuntime(2683): at android.view.View$PerformClick.run(View.java:9080)
12-13 23:06:38.979: E/AndroidRuntime(2683): at android.os.Handler.handleCallback(Handler.java:587)
12-13 23:06:38.979: E/AndroidRuntime(2683): at android.os.Handler.dispatchMessage(Handler.java:92)
12-13 23:06:38.979: E/AndroidRuntime(2683): at android.os.Looper.loop(Looper.java:130)
12-13 23:06:38.979: E/AndroidRuntime(2683): at android.app.ActivityThread.main(ActivityThread.java:3687)
12-13 23:06:38.979: E/AndroidRuntime(2683): at java.lang.reflect.Method.invokeNative(Native Method)
12-13 23:06:38.979: E/AndroidRuntime(2683): at java.lang.reflect.Method.invoke(Method.java:507)
12-13 23:06:38.979: E/AndroidRuntime(2683): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-13 23:06:38.979: E/AndroidRuntime(2683): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-13 23:06:38.979: E/AndroidRuntime(2683): at dalvik.system.NativeStart.main(Native Method)
[/quote]

Aparentemente neste seu exemplo foi criada uma subclasse de Application para não instanciar o databaseHelper sempre que necessário.

Você registrou esta classe no androidmanifest.xml? Possivelmente no teu exemplo a classe App está registrada no androidmanifest, mas talvez vc esqueceu de declará-la no seu código…

[quote=wagnerfrancisco]Aparentemente neste seu exemplo foi criada uma subclasse de Application para não instanciar o databaseHelper sempre que necessário.

Você registrou esta classe no androidmanifest.xml? Possivelmente no teu exemplo a classe App está registrada no androidmanifest, mas talvez vc esqueceu de declará-la no seu código…[/quote]

Então agora coloquei esta classe no manifest.xml

<activity android:name=".App" android:label="@string/app_name" > </activity>

Mais ainda perciste o erro

[quote]12-13 23:31:51.709: W/KeyCharacterMap(2998): No keyboard for id 0
12-13 23:31:51.709: W/KeyCharacterMap(2998): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
12-13 23:31:52.629: D/AndroidRuntime(2998): Shutting down VM
12-13 23:31:52.629: W/dalvikvm(2998): threadid=1: thread exiting with uncaught exception (group=0x40018578)
12-13 23:31:52.639: E/AndroidRuntime(2998): FATAL EXCEPTION: main
12-13 23:31:52.639: E/AndroidRuntime(2998): java.lang.ClassCastException: android.app.Application
12-13 23:31:52.639: E/AndroidRuntime(2998): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.inserirConfig(ConfiguracoesEditarActivity.java:139)
12-13 23:31:52.639: E/AndroidRuntime(2998): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.access$2(ConfiguracoesEditarActivity.java:127)
12-13 23:31:52.639: E/AndroidRuntime(2998): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity$5.onClick(ConfiguracoesEditarActivity.java:122)
12-13 23:31:52.639: E/AndroidRuntime(2998): at android.view.View.performClick(View.java:2485)
12-13 23:31:52.639: E/AndroidRuntime(2998): at android.view.View$PerformClick.run(View.java:9080)
12-13 23:31:52.639: E/AndroidRuntime(2998): at android.os.Handler.handleCallback(Handler.java:587)
12-13 23:31:52.639: E/AndroidRuntime(2998): at android.os.Handler.dispatchMessage(Handler.java:92)
12-13 23:31:52.639: E/AndroidRuntime(2998): at android.os.Looper.loop(Looper.java:130)
12-13 23:31:52.639: E/AndroidRuntime(2998): at android.app.ActivityThread.main(ActivityThread.java:3687)
12-13 23:31:52.639: E/AndroidRuntime(2998): at java.lang.reflect.Method.invokeNative(Native Method)
12-13 23:31:52.639: E/AndroidRuntime(2998): at java.lang.reflect.Method.invoke(Method.java:507)
12-13 23:31:52.639: E/AndroidRuntime(2998): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-13 23:31:52.639: E/AndroidRuntime(2998): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-13 23:31:52.639: E/AndroidRuntime(2998): at dalvik.system.NativeStart.main(Native Method)
[/quote]

[quote=adriano_servitec][quote=wagnerfrancisco]Aparentemente neste seu exemplo foi criada uma subclasse de Application para não instanciar o databaseHelper sempre que necessário.

Você registrou esta classe no androidmanifest.xml? Possivelmente no teu exemplo a classe App está registrada no androidmanifest, mas talvez vc esqueceu de declará-la no seu código…[/quote]

Então agora coloquei esta classe no manifest.xml

<activity android:name=".App" android:label="@string/app_name" > </activity>

Mais ainda perciste o erro[/quote]

Aí você declarou a classe App como uma activity, ela não é. Tem que declarar ela na tag Application:

<application android:name=".App" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name">

Mudei o manifest assim agora

[code]<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="4"
    android:targetSdkVersion="16" />

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:name="App"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".VendaClienteActivity"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name=".ConfiguracoesEditarActivity"
        android:label="@string/app_name" >
    </activity>
</application>

[/code]

E ainda continua o erro

12-14 09:34:49.709: D/AndroidRuntime(4324): Shutting down VM 12-14 09:34:49.709: W/dalvikvm(4324): threadid=1: thread exiting with uncaught exception (group=0x40018578) 12-14 09:34:49.719: E/AndroidRuntime(4324): FATAL EXCEPTION: main 12-14 09:34:49.719: E/AndroidRuntime(4324): java.lang.NumberFormatException: unable to parse '' as integer 12-14 09:34:49.719: E/AndroidRuntime(4324): at java.lang.Integer.parseInt(Integer.java:362) 12-14 09:34:49.719: E/AndroidRuntime(4324): at java.lang.Integer.parseInt(Integer.java:332) 12-14 09:34:49.719: E/AndroidRuntime(4324): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.inserirConfig(ConfiguracoesEditarActivity.java:132) 12-14 09:34:49.719: E/AndroidRuntime(4324): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity.access$2(ConfiguracoesEditarActivity.java:128) 12-14 09:34:49.719: E/AndroidRuntime(4324): at br.com.azsolucoes.azcomanda.activities.ConfiguracoesEditarActivity$5.onClick(ConfiguracoesEditarActivity.java:123) 12-14 09:34:49.719: E/AndroidRuntime(4324): at android.view.View.performClick(View.java:2485) 12-14 09:34:49.719: E/AndroidRuntime(4324): at android.view.View$PerformClick.run(View.java:9080) 12-14 09:34:49.719: E/AndroidRuntime(4324): at android.os.Handler.handleCallback(Handler.java:587) 12-14 09:34:49.719: E/AndroidRuntime(4324): at android.os.Handler.dispatchMessage(Handler.java:92) 12-14 09:34:49.719: E/AndroidRuntime(4324): at android.os.Looper.loop(Looper.java:130) 12-14 09:34:49.719: E/AndroidRuntime(4324): at android.app.ActivityThread.main(ActivityThread.java:3687) 12-14 09:34:49.719: E/AndroidRuntime(4324): at java.lang.reflect.Method.invokeNative(Native Method) 12-14 09:34:49.719: E/AndroidRuntime(4324): at java.lang.reflect.Method.invoke(Method.java:507) 12-14 09:34:49.719: E/AndroidRuntime(4324): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 12-14 09:34:49.719: E/AndroidRuntime(4324): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 12-14 09:34:49.719: E/AndroidRuntime(4324): at dalvik.system.NativeStart.main(Native Method)

Continuou o erro nada, veja que ele mudou, agora é outra coisa.

O erro aí é muito simples, basta você ler a mensagem. Ele disse que não conseguiu fazer parsing da string vazia (’’) para inteiro.

Veja no seu método (inserirConfig), você está chamando parseInt, de repente o valor que tu passou é vazio. Valide isto…

[quote=wagnerfrancisco]Continuou o erro nada, veja que ele mudou, agora é outra coisa.

O erro aí é muito simples, basta você ler a mensagem. Ele disse que não conseguiu fazer parsing da string vazia (’’) para inteiro.

Veja no seu método (inserirConfig), você está chamando parseInt, de repente o valor que tu passou é vazio. Valide isto…[/quote]Sim depois que postei percebi que o erro tinha mudado, vou debugar pra ver o que esta acontecendo, obrigado por ajudar.