0

我在 Motodev 上的项目遇到了严重问题,我为 android 制作了一个 apk,现在我正在尝试在其上实现一个数据库,我正在使用教程进行构建,但我遇到了 2 个问题,只有 2 个表和 1 个数据库,就是这样:

 public class VeiculoDAO {  

        public static final String NOME_TABELA ="Veiculo";
        public static final String COLUNA_ID = "id";
        public static final String COLUNA_MARCA = "marca";
        public static final String COLUNA_MVEICULO = "mveiculo";
        public static final String COLUNA_PLACA = "placa";
        public static final String COLUNA_RENAVAM = "renavam";
        public static final String COLUNA_TIPOVEICULO = "tipoveiculo";


        public static final String SCRIPT_CRIACAO_TABELA_VEICULOS = "CREATE TABLE " + NOME_TABELA + "("
                + COLUNA_ID + " INTEGER PRIMARY KEY," + COLUNA_MARCA + " TEXT," + COLUNA_PLACA + " TEXT,"
                + COLUNA_RENAVAM + " TEXT," + COLUNA_MVEICULO + " TEXT," + COLUNA_TIPOVEICULO + " TEXT" + ")";

        public static final String SCRIPT_DELECAO_TABELA =  "DROP TABLE IF EXISTS " + NOME_TABELA;


        private SQLiteDatabase dataBase = null;


        private static VeiculoDAO instance;

        public static VeiculoDAO getInstance(Context context) {
            if(instance == null)
            instance = new VeiculoDAO(context);
            return instance;
        }

        private VeiculoDAO(Context context) {
            PersistenceHelper persistenceHelper = PersistenceHelper.getInstance(context);
            dataBase = persistenceHelper.getWritableDatabase();
        }

        public void salvar(Veiculo veiculo) {
            ContentValues values = gerarContentValeuesVeiculo(veiculo);
            dataBase.insert(NOME_TABELA, null, values);
        }

        public List<Veiculo> recuperarTodos() {
            String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
            Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
            List<Veiculo> veiculos = construirVeiculoPorCursor(cursor);

            return veiculos;
        }

        public void deletar(Veiculo veiculo) {

            String[] valoresParaSubstituir = {
                    String.valueOf(veiculo.getId())
            };

            dataBase.delete(NOME_TABELA, COLUNA_ID + " =  ?", valoresParaSubstituir);
        }

        public void editar(Veiculo veiculo) {
            ContentValues valores = gerarContentValeuesVeiculo(veiculo);

            String[] valoresParaSubstituir = {
                    String.valueOf(veiculo.getId())
            };

            dataBase.update(NOME_TABELA, valores, COLUNA_ID + " = ?", valoresParaSubstituir);
        }

        public void fecharConexao() {
            if(dataBase != null && dataBase.isOpen())
                dataBase.close();
        }


        private List<Veiculo> construirVeiculoPorCursor(Cursor cursor) {
            List<Veiculo> veiculos = new ArrayList<Veiculo>();
            if(cursor == null)
                return veiculos;

            try {

                if (cursor.moveToFirst()) {
                    do {

                        int indexID = cursor.getColumnIndex(COLUNA_ID);
                        int indexMarca = cursor.getColumnIndex(COLUNA_MARCA);
                    int indexRenavam = cursor.getColumnIndex(COLUNA_RENAVAM);
                        int indexMveiculo = cursor.getColumnIndex(COLUNA_MVEICULO);
                        int indexTipoveiculo = cursor.getColumnIndex(COLUNA_TIPOVEICULO);

                        int id = cursor.getInt(indexID);
                        String marca = cursor.getString(indexMarca);
                        String placa = cursor.getString(indexPlaca);
                        String renavam = cursor.getString(indexRenavam);
                        String mveiculo = cursor.getString(indexMveiculo);
                        String tipoveiculo = cursor.getString(indexTipoveiculo);

                        Veiculo veiculo = new Veiculo(id, marca, placa, renavam, mveiculo, tipoveiculo);

                        veiculos.add(veiculo);

                    } while (cursor.moveToNext());
                }

            } finally {
                cursor.close();
            }
            return veiculos;
        }    
        private ContentValues gerarContentValeuesVeiculo(Veiculo veiculo) {
            ContentValues values = new ContentValues();
            values.put(COLUNA_ID, veiculo.getId());
            values.put(COLUNA_MARCA, veiculo.getMarca());
            values.put(COLUNA_PLACA, veiculo.getPlaca());
            values.put(COLUNA_RENAVAM, veiculo.getRenavam());
            values.put(COLUNA_MVEICULO, veiculo.getMveiculo());
            values.put(COLUNA_TIPOVEICULO, veiculo.getTipoveiculo());
            return values;      } 
 }

和另一个...

 public class CadastroDAO { 


        public static final String NOME_TABELA ="Cadastro";
        public static final String COLUNA_NOME = "nome";
        public static final String COLUNA_TELEFONE = "telefone";
        public static final String COLUNA_TELEFONEDISPOSITIVO = "telefoneDispositivo";
        public static final String COLUNA_EMAIL = "email";
        public static final String COLUNA_CPF = "cpf";
        public static final String COLUNA_RG = "rg";
        public static final String COLUNA_ENDERECO = "endereco";
        public static final String COLUNA_CEP = "cep";
        public static final String COLUNA_SENHA = "senha"; 
   //       public static final String COLUNA_ID = "id";


        public static final String SCRIPT_CRIACAO_TABELA_CADASTROS = "CREATE TABLE " + NOME_TABELA + "("
                + COLUNA_CPF + " TEXT PRIMARY KEY," + COLUNA_NOME + " TEXT," + COLUNA_TELEFONE + " TEXT," + COLUNA_TELEFONEDISPOSITIVO + "
 TEXT,"
                + COLUNA_EMAIL + " TEXT," + COLUNA_RG + " TEXT," + COLUNA_ENDERECO + " TEXT,"
                + COLUNA_CEP + " TEXT," + COLUNA_SENHA + " TEXT," + ")";

        public static final String SCRIPT_DELECAO_TABELA =  "DROP TABLE IF EXISTS " + NOME_TABELA;


        private SQLiteDatabase dataBase = null;


        private static CadastroDAO instance;

        public static CadastroDAO getInstance(Context context) {
            if(instance == null)
                instance = new CadastroDAO(context);
            return instance;
        }

        private CadastroDAO(Context context) {
            PersistenceHelper persistenceHelper = PersistenceHelper.getInstance(context);
            dataBase = persistenceHelper.getWritableDatabase();
        }

        public void salvar(Cadastro cadastro) {
            ContentValues values = gerarContentValeuesCadastro(cadastro);
            dataBase.insert(NOME_TABELA, null, values);
        }

        public List<Cadastro> recuperarTodos() {
            String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
            Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
            List<Cadastro> cadastros = construirCadastroPorCursor(cursor);

            return cadastros;
        }

        public void deletar(Cadastro cadastro) {

            String[] valoresParaSubstituir = {
                    String.valueOf(cadastro.getCpf())
            };

            dataBase.delete(NOME_TABELA, COLUNA_CPF + " =  ?", valoresParaSubstituir);
        }

        public void editar(Cadastro cadastro) {
            ContentValues valores = gerarContentValeuesCadastro(cadastro);

            String[] valoresParaSubstituir = {
                    String.valueOf(cadastro.getCpf())
            };

            dataBase.update(NOME_TABELA, valores, COLUNA_CPF + " = ?", valoresParaSubstituir);
        }

        public void fecharConexao() {
            if(dataBase != null && dataBase.isOpen())
                dataBase.close();
        }


        private List<Cadastro> construirCadastroPorCursor(Cursor cursor) {
            List<Cadastro> cadastros = new ArrayList<Cadastro>();
            if(cursor == null)
                return cadastros;

            try {

                if (cursor.moveToFirst()) {
                    do {
                        int indexNome = cursor.getColumnIndex(COLUNA_NOME);
                        int indexTelefone = cursor.getColumnIndex(COLUNA_TELEFONE);
                        int indexTelefoneDisposivo = cursor.getColumnIndex(COLUNA_TELEFONEDISPOSITIVO);
                        int indexEmail = cursor.getColumnIndex(COLUNA_EMAIL);
                        int indexCpf = cursor.getColumnIndex(COLUNA_CPF);
                        int indexRg = cursor.getColumnIndex(COLUNA_RG);
                        int indexEndereco = cursor.getColumnIndex(COLUNA_ENDERECO);
                        int indexCep = cursor.getColumnIndex(COLUNA_CEP);
                        int indexSenha = cursor.getColumnIndex(COLUNA_SENHA); //                        int
 indexId = cursor.getColumnIndex(COLUNA_ID);

                        String nome = cursor.getString(indexNome);
                        String telefone = cursor.getString(indexTelefone);
                        String telefoneDispositivo = cursor.getString(indexTelefoneDisposivo);
                        String email = cursor.getString(indexEmail);
                        String cpf = cursor.getString(indexCpf);
                        String rg = cursor.getString(indexRg);
                        String endereco = cursor.getString(indexEndereco);          
                        String cep = cursor.getString(indexCep);
                        String senha = cursor.getString(indexSenha); //                     int id = cursor.getInt(indexId);

                        Cadastro cadastro = new Cadastro(nome, telefone, telefoneDispositivo, email, cpf,
                                rg, endereco, cep, senha);

                        cadastros.add(cadastro);

                    } while (cursor.moveToNext());
                }

            } finally {
                cursor.close();
            }
            return cadastros;
        }

        private ContentValues gerarContentValeuesCadastro(Cadastro cadastro) {
            ContentValues values = new ContentValues();
            values.put(COLUNA_NOME, cadastro.getNome());
            values.put(COLUNA_TELEFONE, cadastro.getTelefone());
            values.put(COLUNA_TELEFONEDISPOSITIVO, cadastro.getTelefoneDispositivo());
            values.put(COLUNA_EMAIL, cadastro.getEmail());
            values.put(COLUNA_CPF, cadastro.getCpf());
            values.put(COLUNA_RG, cadastro.getRg());
            values.put(COLUNA_ENDERECO, cadastro.getEndereco());
            values.put(COLUNA_CEP, cadastro.getCep());
            values.put(COLUNA_SENHA, cadastro.getSenha()); //           values.put(COLUNA_ID, cadastro.getVeiculo().getId());
            return values;
        }

 }

我也使用了一个 Persistence Helper ......

public class PersistenceHelper extends SQLiteOpenHelper {

     public static final String NOME_BANCO =  "ExemploVeiculo";
     public static final int VERSAO =  2;


     //Declaração de Variáveis do bd tabela Cadastro
     public static final String NOME_TABELA_1 = "Cadastro";
     public static final String COLUNA_NOME = "nome";
     public static final String COLUNA_TELEFONE = "telefone";
     public static final String COLUNA_TELEFONEDISPOSITIVO = "telefoneDispositivo";
     public static final String COLUNA_EMAIL = "email";
     public static final String COLUNA_CPF = "cpf";
     public static final String COLUNA_RG = "rg";
     public static final String COLUNA_ENDERECO = "endereco";
     public static final String COLUNA_CEP = "cep";
     public static final String COLUNA_SENHA = "senha";

     public static final String SCRIPT_CRIACAO_TABELA_CADASTROS = "CREATE TABLE " + NOME_TABELA_1 + "("
             + COLUNA_CPF + " TEXT PRIMARY KEY," + COLUNA_NOME + " TEXT," + COLUNA_TELEFONE + " TEXT,"+ COLUNA_TELEFONEDISPOSITIVO + "
 TEXT,"
             + COLUNA_EMAIL + " TEXT," + COLUNA_RG + " TEXT," + COLUNA_ENDERECO + " TEXT,"
             + COLUNA_CEP + " TEXT," + COLUNA_SENHA + " TEXT" + ")";

     public static final String SCRIPT_DELECAO_TABELA_1 =  "DROP TABLE IF EXISTS " + NOME_TABELA_1;
        //Declaração de Variáveis do bd tabela Veiculo
     public static final String NOME_TABELA_2 = "Veiculo";
     public static final String COLUNA_ID = "id";
     public static final String COLUNA_MARCA = "marca";
     public static final String COLUNA_MVEICULO = "mveiculo";
     public static final String COLUNA_PLACA = "placa";
     public static final String COLUNA_RENAVAM = "renavam";
     public static final String COLUNA_TIPOVEICULO = "tipoveiculo";

     public static final String SCRIPT_CRIACAO_TABELA_VEICULOS = "CREATE TABLE " + NOME_TABELA_2 + "("
             + COLUNA_ID + " INTEGER PRIMARY KEY," + COLUNA_MARCA + " TEXT," + COLUNA_PLACA + " TEXT,"
             + COLUNA_RENAVAM + " TEXT," + COLUNA_MVEICULO + " TEXT," + COLUNA_TIPOVEICULO + " TEXT" + ")";

     public static final String SCRIPT_DELECAO_TABELA_2 =  "DROP TABLE IF EXISTS " + NOME_TABELA_2; 


     private static PersistenceHelper instance;

     private PersistenceHelper(Context context) {
         super(context, NOME_BANCO, null, VERSAO);
     }

     @Override
     public void onCreate(SQLiteDatabase db) {

         if (db.isDbLockedByCurrentThread()){
             Log.d(TAG, "Database locked by current thread...");
         }

         if (db.isOpen()){
             Log.d(TAG, "OK.. Database open");
         }

         if (db.isReadOnly()){
            Log.e(TAG, "The database is read only");
         }

         if (db.inTransaction()){
            Log.e(TAG, "Why id the databse in transaction???");
         }

         Log.d(TAG, "Call to onCreate");

         Log.d(TAG, "Creating table..." + SCRIPT_CRIACAO_TABELA_CADASTROS);

         db.beginTransaction();
         db.execSQL(SCRIPT_CRIACAO_TABELA_CADASTROS);
         db.endTransaction();

         Log.d(TAG, "Creating table..." + SCRIPT_CRIACAO_TABELA_VEICULOS);

         db.beginTransaction();
         db.execSQL(SCRIPT_CRIACAO_TABELA_VEICULOS);
         db.endTransaction();

     }

     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SCRIPT_DELECAO_TABELA_1);
         db.execSQL(SCRIPT_DELECAO_TABELA_2);

         onCreate(db);
     }

     @Override
     public void onOpen(SQLiteDatabase db) {
         super.onOpen(db);
         Log.d(TAG, "Opening the database... " + db.getPath() + " version " + db.getVersion());
     } 

     public static PersistenceHelper getInstance(Context context) {
         if(instance == null)
             instance = new PersistenceHelper(context);

         return instance;
     }


     private static final String TAG = "PersistenceHelper";

       //    @Override //    public void onCreate(SQLiteDatabase db) { //       db.execSQL(SCRIPT_CRIACAO_TABELA_CADASTROS); //     
db.execSQL(SCRIPT_CRIACAO_TABELA_VEICULOS); //         //    }




     public List<Cadastro> listar() {

        Cadastro d = new Cadastro();
     ArrayList<Cadastro> lista = new ArrayList<Cadastro>();
     SQLiteDatabase db = getReadableDatabase();
     Cursor c = db.query(NOME_TABELA_1, null, null, null, null, null, null);
     if(c.getCount() > 0) {
        c.moveToFirst();
            while(!c.isAfterLast()){

                d.setCpf(c.getString(0));
                d.setNome(c.getString(1));
                d.setTelefone(c.getString(2));
                d.setTelefoneDispositivo(c.getString(3));
                d.setEmail(c.getString(4));
                d.setRg(c.getString(5));
                d.setEndereco(c.getString(6));
                d.setCep(c.getString(7));
                d.setSenha(c.getString(8));

                lista.add(d);
                c.moveToNext();
               }
             }

             db.close();
             return lista;}    }

但是 apk 无法正常工作,logcat 上出现此错误:

这里有表 veiculo 的问题:

D/PersistenceHelper(274): Creating
table...CREATE TABLE Cadastro(cpf TEXT PRIMARY KEY,nome TEXT,telefone
TEXT,telefoneDispositivo TEXT,email TEXT,rg TEXT,endereco TEXT,cep
TEXT,senha TEXT) 05-27 07:16:03.873: D/PersistenceHelper(274):
Creating table...CREATE TABLE Veiculo(id INTEGER PRIMARY KEY,marca
TEXT,placa TEXT,renavam TEXT,mveiculo TEXT,tipoveiculo TEXT) 05-27
07:16:03.915: D/PersistenceHelper(274): Opening the database...
/data/data/com.example.sgm/databases/ExemploVeiculo version 1 05-27
07:16:03.915: I/Database(274): sqlite returned: error code = 1, msg =
table Veiculo has no column named renavam 05-27 07:16:03.933:
E/Database(274): Error inserting placa=gjm id=1 marca=ad mveiculo=da
renavam=123 tipoveiculo=ptw 05-27 07:16:03.933: E/Database(274):
android.database.sqlite.SQLiteException: table Veiculo has no column
named renavam: , while compiling: INSERT INTO Veiculo(placa, id,
marca, mveiculo, renavam, tipoveiculo) VALUES(?, ?, ?, ?, ?, ?); 05-27

这里有表 cadastro 的问题

I/ActivityManager(58): Starting activity: Intent {
cmp=com.example.sgm/.Cadastro } 05-27 07:16:04.384:
I/ActivityManager(58): Displayed activity com.example.sgm/.Cadastro:
435 ms (total 435 ms) 05-27 07:16:04.623: D/dalvikvm(107):
GC_EXTERNAL_ALLOC freed 3136 objects / 114640 bytes in 311ms 05-27
07:16:14.344: D/dalvikvm(107): GC_EXTERNAL_ALLOC freed 2178 objects /
83016 bytes in 62ms 05-27 07:16:24.284: D/dalvikvm(107):
GC_EXTERNAL_ALLOC freed 783 objects / 40168 bytes in 99ms 05-27
07:16:27.924: D/dalvikvm(58): GREF has increased to 301 05-27
07:16:30.713: D/dalvikvm(107): GC_EXTERNAL_ALLOC freed 606 objects /
33672 bytes in 75ms 05-27 07:16:39.064: D/dalvikvm(107):
GC_EXTERNAL_ALLOC freed 3175 objects / 115360 bytes in 119ms 05-27
07:16:43.214: D/dalvikvm(274): GC_FOR_MALLOC freed 12100 objects /
506008 bytes in 119ms 05-27 07:16:44.204: I/Database(274): sqlite
returned: error code = 1, msg = no such table: Cadastro 05-27
07:16:44.204: E/Database(274): Error inserting cep=123456 email=jmg
telefone=321 rg=1234 cpf=12345 nome=adgp telefoneDispositivo=654
senha=bjt endereco=twp 05-27 07:16:44.204: E/Database(274):
android.database.sqlite.SQLiteException: no such table: Cadastro: ,
while compiling: INSERT INTO Cadastro(cep, email, telefone, rg, cpf,
nome, telefoneDispositivo, senha, endereco) VALUES(?, ?, ?, ?, ?, ?,
?, ?, ?);

所以有人帮忙吗?抱歉英语不好,但我不知道错误在哪里,我是新手,然后我把数据库的所有代码和一个重要的 logcat 代码,如果有人知道,我将非常感激。

4

1 回答 1

1

您没有正确使用事务。如果您endTransaction()不带调用setTransactionSuccessful(),它将回滚事务中的所有更改。因此,您的CREATE TABLE命令被回滚。

beginTransaction()文档有关于如何使用事务的明确示例:

db.beginTransaction();
try {
  ...
  db.setTransactionSuccessful();
} finally {
  db.endTransaction();
}
于 2013-05-27T08:18:47.960 回答