Inserir dados no SQLite? [Resolvido]

8 respostas
A

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

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)

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

A classe databaseHelper
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;
	}

}
a classe Casa
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;
	}

}
A classe App
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);
	}

}

E o método a aonde estou chamando

botao_salvar.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				inserirConfig();
			}
		});
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();
				}
			}
		}

	}
Mais aqui nesta linha quando chama este metodo INSERIRCASAS
if (id == 0) {
				app.getDatabaseHelper()
						.inserirCasas(casa);
Aqui não esta funcionando
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();
	}
Mudei aqui também O codigo original do exemplo era assim
App app = (App) getApplicationContext();
Mais assim dava erro Quando alterei assim
App app = new App();
Passou nesta linha, mais ai gera o erro la aonde falei INSERIRCASAS

Obrigado a todos que me ajudarem.

8 Respostas

W

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()) ?

A

wagnerfrancisco:
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

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()) ?

Obrigado pela ajuda, então quando deixo na forma original da este erro

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

</blockquote>
W

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…

A

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…

Então agora coloquei esta classe no manifest.xml

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

Mais ainda perciste o erro

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

</blockquote>
W

adriano_servitec:
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…

Então agora coloquei esta classe no manifest.xml

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

Mais ainda perciste o erro

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">
A

Mudei o manifest assim agora

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.azsolucoes.azcomanda.activities"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0" >

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

</manifest>
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)
W

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…

A

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…

Sim depois que postei percebi que o erro tinha mudado, vou debugar pra ver o que esta acontecendo, obrigado por ajudar.

Criado 13 de dezembro de 2012
Ultima resposta 14 de dez. de 2012
Respostas 8
Participantes 2