Eu modifiquei a classe DataBase.java para o seguinte código, obedecendo suas dicas. Eu mantive a linha 16 porque ela é usada no método onCreate():
package br.com.android.projeto.dao;
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.SQLiteOpenHelper;
import android.util.Log;
import br.com.android.projeto.bean.Disciplina;
public class DataBase extends SQLiteOpenHelper {
private static String BANCO = "quizz";
private SQLiteDatabase db;
private ContentValues cv = new ContentValues();
public DataBase(Context context) {
super(context, BANCO, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table disciplina (id integer primary key autoincrement, " +
"nome text not null)");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
public void inserirDisciplina(Disciplina d) {
db = getWritableDatabase();
cv.put("id", d.getId());
cv.put("nome", d.getNome());
// Inserindo
db.insert(BANCO, null, cv);
// Sempre é recomendado fechar o banco de dados para não haver perda de
// memória ou até uma possível invasão de dados
db.close();
}
public List<Disciplina> listarDisciplinas() {
Disciplina d;
// Criando nossa lista com os dados que estão contido no DB
ArrayList<Disciplina> lista = new ArrayList<Disciplina>();
// Inicializando modo de leitura do DB
db = getReadableDatabase();
Log.i("teste", "'ReadableDatabase()' obtido.");
// Cursor apontará para a tabela e organizará por ordem de valor do id
Cursor c = db.query(BANCO, null, null, null, null, null, "id");
Log.i("teste", "Query executada.");
// Checando se o DB contém algo
if (c.getCount() > 0) {
// Cursor está apontando para a coluna com id = 0
c.moveToFirst();
Log.i("teste", "Cursor no primeiro registro.");
// Enquanto não for a última coluna
while (!c.isAfterLast()) {
// Lendo os dados do DB
Integer id = c.getInt(0);
String nome = c.getString(1);
d = new Disciplina(id, nome);
// Adicionando os dados lidos na lista criada
lista.add(d);
c.moveToNext();
}
}
// Fechando cursor e database
c.close();
db.close();
return lista;
}
}
Na classe LoginActivity.java, descomentei as linhas 31 até 37:
package br.com.android.projeto;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import br.com.android.projeto.bean.Disciplina;
import br.com.android.projeto.dao.DataBase;
public class LoginActivity extends Activity {
private DataBase db = new DataBase(this);
List<Disciplina> lista = new ArrayList<Disciplina>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i("teste", "Layout criado.");
// Inserindo
Disciplina d1 = new Disciplina(1, "Geografia");
db.inserirDisciplina(d1);
imprime("Inserindo Disciplina: '" + d1.toString() + "'.");
Disciplina d2 = new Disciplina(2, "Matemática");
db.inserirDisciplina(d2);
imprime("Inserindo Disciplina: '" + d2.toString() + "'.");
imprime("Listando Disciplinas:");
Log.i("teste", "Listando disciplinas.");
lista = db.listarDisciplinas();
for (Disciplina d : lista) {
Log.i("teste", "Listando disciplinas, dentro do while.");
imprime(d.toString());
}
}
public void imprime(String texto) {
Toast.makeText(LoginActivity.this, texto, Toast.LENGTH_SHORT).show();
Toast.makeText(LoginActivity.this, texto, Toast.LENGTH_SHORT).show();
Toast.makeText(LoginActivity.this, texto, Toast.LENGTH_SHORT).show();
}
}
Os erros obtidos são os mesmos que comecei a obter terça-feira da semana passada, que são erros como no such table, java.lang.RuntimeException: Unable to start activity ComponentInfo. Só a clássica Caused by: java.lang.NullPointerException, seguida de at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) que não apareceu desse vez.
[list]
02-07 19:42:46.388: I/teste(419): Listando disciplinas.
02-07 19:42:46.418: I/teste(419): ‘ReadableDatabase()’ obtido.
02-07 19:42:46.418: I/Database(419): sqlite returned: error code = 1, msg = no such table: quizz
02-07 19:42:46.418: D/AndroidRuntime(419): Shutting down VM
02-07 19:42:46.428: W/dalvikvm(419): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
02-07 19:42:46.448: E/AndroidRuntime(419): FATAL EXCEPTION: main
02-07 19:42:46.448: E/AndroidRuntime(419): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.android.projeto/br.com.android.projeto.LoginActivity}: android.database.sqlite.SQLiteException: no such table: quizz: , while compiling: SELECT * FROM quizz ORDER BY id
02-07 19:42:46.448: E/AndroidRuntime(419): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-07 19:42:46.448: E/AndroidRuntime(419): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-07 19:42:46.448: E/AndroidRuntime(419): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-07 19:42:46.448: E/AndroidRuntime(419): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-07 19:42:46.448: E/AndroidRuntime(419): at android.os.Handler.dispatchMessage(Handler.java:99)
02-07 19:42:46.448: E/AndroidRuntime(419): at android.os.Looper.loop(Looper.java:123)
02-07 19:42:46.448: E/AndroidRuntime(419): at android.app.ActivityThread.main(ActivityThread.java:4627)
02-07 19:42:46.448: E/AndroidRuntime(419): at java.lang.reflect.Method.invokeNative(Native Method)
02-07 19:42:46.448: E/AndroidRuntime(419): at java.lang.reflect.Method.invoke(Method.java:521)
02-07 19:42:46.448: E/AndroidRuntime(419): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-07 19:42:46.448: E/AndroidRuntime(419): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-07 19:42:46.448: E/AndroidRuntime(419): at dalvik.system.NativeStart.main(Native Method)
02-07 19:42:46.448: E/AndroidRuntime(419): Caused by: android.database.sqlite.SQLiteException: no such table: quizz: , while compiling: SELECT * FROM quizz ORDER BY id
[/list]
A questão é:
Eu preciso de um projeto Android que acesse banco de dados, e que crie tabelas (ou leia-as caso já existam), remova, insira e atualize, sem dar erros como os listados acima.
Já tentei diversas abordagens (Felipe Silveira, Ricardo Lecheta, Felipe Bonezi), mas elas sempre funcionam pela metade (ou só inserem, ou só pesquisam, ou só criam tabela toda vez, etc).