2013-05-27 5 views
0

Motodev에 대한 프로젝트에 심각한 문제가 있습니다. 나는 한 APK를 안드로이드로 만들었고 이제는 데이터베이스를 구현하려고합니다. 자습서로 제작하고 있었지만 이 문제가 발생,이 단지 2 표, 한 데이터베이스입니다 :Sqlite 해당 테이블 오류 코드 없음 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; 
     } 

} 

내가 하나의 지속성 도우미를 사용 너무 ...

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;} } 
,363,210

하지만 APK는 로그 캣에이 오류와 함께 작동하지 않는 : 테이블 veiculo와

다음

문제 :

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

그래서 누구든지 도움이 테이블 cadastro와

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 

여기에 문제? 죄송합니다 나쁜 영어지만, 나는 어디서 오류인지 모르겠다. 그리고 나는 그때 나는 데이터베이스의 모든 코드와 logcat의 중요한 조각을 넣었다. 누군가 알고 있다면, 나는 매우 감사 할 것이다.

+0

난 당신이 응용 프로그램의 데이터를 삭제 한 다음 응용 프로그램을 다시 설치하고 –

답변

1

트랜잭션을 올바르게 사용하고 있지 않습니다. setTransactionSuccessful()없이 endTransaction()을 호출하면 트랜잭션의 모든 변경 사항을 롤백합니다. 따라서 CREATE TABLE 명령이 롤백됩니다. 오 \, 내가하고 작품을 변경

db.beginTransaction(); 
try { 
    ... 
    db.setTransactionSuccessful(); 
} finally { 
    db.endTransaction(); 
} 
+0

whoaaaa을 시도하는 것이 좋습니다 것 :

The beginTransaction() documentation 트랜잭션을 사용하는 방법에 대한 명확한 예를 가지고 고마워, 내가 보지 못했던 (많은 다른 exeples의 조각) 나는 본적이 없어 setTransationSuccessful(); 상관 없어, 지금 일하고있어, 고마워. –

관련 문제