SQLite奇怪的错误

时间:2014-04-01 19:22:56

标签: android sqlite

几分钟前一切都很好,但突然停止工作并抛出奇怪的错误。例如,“我的表中没有列”,我将保留代码以查看是否可以提供帮助,实际上不会对此错误进行任何更改。

String sqlCreateBDEvent = "CREATE TABLE IF NOT EXISTS Evento  (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, codigo_evento TEXT , nombre TEXT, codigo_usuario TEXT, folio TEXT, nombre_cliente TEXT)";
String sqlCreateBDInscripcion = "CREATE TABLE IF NOT EXISTS Inscripcion (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, hash TEXT, codigo_evento TEXT, ticket TEXT, nombre TEXT, inscripcion_id TEXT, validado int, sincronizado int, numero TEXT, categoria TEXT, codigo_usuario TEXT, rut TEXT, talla TEXT)";
private static TicketsBaseDatos sInstance;
public static TicketsBaseDatos getInstance(Context context) {

    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context.
    // See this article for more information: http://bit.ly/6LRzfx
    if (sInstance == null) {
      sInstance = new TicketsBaseDatos(context.getApplicationContext());
    }
    return sInstance;
  }


public TicketsBaseDatos(Context ctx) {
    super(ctx, "Eventrid", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
     db.execSQL(sqlCreateBDEvent);
     db.execSQL(sqlCreateBDInscripcion);
}


@Override
public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {
     //NOTA: Por simplicidad del ejemplo aquí utilizamos directamente la opción de
    //      eliminar la tabla anterior y crearla de nuevo vacía con el nuevo formato.
    //      Sin embargo lo normal será que haya que migrar datos de la tabla antigua
    //      a la nueva, por lo que este método debería ser más elaborado.
    //Se elimina la versión anterior de la tabla
    //db.execSQL("DROP TABLE IF EXISTS Inscripcion");
}

public void eliminarTablasBD(){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL("DROP TABLE IF EXISTS Inscripcion");
    db.execSQL("DROP TABLE IF EXISTS Evento");
    db.close();
}

public void crearTablasBD(){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL(sqlCreateBDEvent);
    db.execSQL(sqlCreateBDInscripcion);
    db.close();
}

public void eliminarElementos(){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL("DELETE FROM Inscripcion");
    db.execSQL("DELETE FROM Evento");
    db.close();
}

...

public void sincronizarBD(Context context, String codigoEvento) {
    Connection cn = new Connection();
    if(cn.isNetworkAvailable(context)){
        SessionManager manager = new SessionManager();
        folioEvento = manager.getValue(context,"folioEvento");
        nombreCliente = manager.getValue(context,"nombreCliente");
        codigoUser = manager.getValue(context,"codigoUser");
        nombreUser = manager.getValue(context, "nombreUser");
        hashUser = manager.getValue(context, "hashUsuario");
        JSONParser jParser = new JSONParser();
        try {
              SQLiteDatabase db = TicketsBaseDatos.getInstance(context).getWritableDatabase();
              do{
                  int recorrido = 0;
                  JSONObject json = jParser.getJSONFromUrl(Config.URL_BASE+nombreCliente+"/"+Config.URL_DESCARGA_BD+nombreUser+"/"+hashUser+"/"+folioEvento+"/"+start+"/"+cantidad);
                  JSONArray array = json.getJSONArray("Inscripciones");
                  for (int i = 0; i < array.length(); i++) {
                          recorrido++;
                          JSONObject rowParticipante = array.getJSONObject(i);
                              System.out.println(i);
                              ContentValues nuevoRegistro = new ContentValues();
                              nuevoRegistro.put("hash", rowParticipante.getString("hash"));
                              nuevoRegistro.put("codigo_evento", rowParticipante.getString("codigo_evento"));
                              nuevoRegistro.put("ticket",rowParticipante.getString("ticket"));
                              nuevoRegistro.put("nombre",rowParticipante.getString("nombre"));
                              nuevoRegistro.put("inscripcion_id",rowParticipante.getString("inscripcion_id"));
                              nuevoRegistro.put("validado", rowParticipante.getInt("validado"));
                              nuevoRegistro.put("sincronizado", 0);
                              nuevoRegistro.put("numero", rowParticipante.getString("numero"));
                              nuevoRegistro.put("categoria", rowParticipante.getString("categoria"));
                              nuevoRegistro.put("codigo_usuario", codigoUser);
                              nuevoRegistro.put("rut", rowParticipante.getString("rut_clean"));
                              nuevoRegistro.put("talla", rowParticipante.getString("talla"));
                              System.out.println("Guardado con exito");
                              db.insert("Inscripcion", null, nuevoRegistro);
                  }
                  if(recorrido>0){
                      start = start + cantidad;
                  } else {
                      continuar = false;
                  }
              }while(continuar == true);
      } catch (JSONException e) {
        e.printStackTrace();
      }
    }
}

这种方法让我举例说,没有'车辙'栏。另一种方法中的奇怪之处在于我以同样的方式占据了另一张桌子,没有错。

public void guardarEventos(Context context){
    ConnectionInternet cn = new ConnectionInternet();
    if(cn.isNetworkAvailable(context)){
        SQLiteDatabase dbd = TicketsBaseDatos.getInstance(context).getWritableDatabase();
        dbd.execSQL("DELETE FROM Evento");
        SessionManager manager = new SessionManager();
        nombreCliente = manager.getValue(context,"nombreCliente");
        nombreUser = manager.getValue(context, "nombreUser");
        hashUser = manager.getValue(context, "hashUsuario");
        codigoUser = manager.getValue(context,"codigoUser");
        JSONParser jParser = new JSONParser();
        JSONObject json = jParser.getJSONFromUrl(Config.URL_BASE+nombreCliente+"/"+Config.URL_DESCARGA_EVENTOS+nombreUser+"/"+hashUser);
        try {
              JSONArray array = json.getJSONArray("Eventos");
              System.out.println("Total eventos : "+array.length());
              for (int i = 0; i < array.length(); i++) {
                  JSONObject rowParticipante = array.getJSONObject(i);
                  PruebaBD bdTickets = new PruebaBD(context, "Eventrid", null, 1);
                  SQLiteDatabase db = bdTickets.getWritableDatabase();
                  ContentValues nuevoRegistro = new ContentValues();
                  nuevoRegistro.put("codigo_evento", rowParticipante.getString("codigo_evento"));
                  nuevoRegistro.put("nombre", rowParticipante.getString("glosa"));
                  nuevoRegistro.put("codigo_usuario",codigoUser);
                  nuevoRegistro.put("folio",rowParticipante.getString("folio"));
                  nuevoRegistro.put("nombre_cliente",nombreCliente);
                  System.out.println("Guardado con exito");
                  db.insert("Evento", null, nuevoRegistro);
                  db.close();
              }
      } catch (JSONException e) {
        e.printStackTrace();
      }
    }
}

错误SQL:

04-02 03:24:53.538: E/SQLiteLog(32674): (1) table Inscripcion has no column named rut
04-02 03:24:53.538: E/SQLiteDatabase(32674): Error inserting nombre=Felipe Andres categoria=V 40-44 ticket=60KM codigo_evento=SI-CRSCT hash=288D5EF2BD554F700A904D9F codigo_usuario=SI-1 validado=0 rut=12520130K talla= sincronizado=0 inscripcion_id=49188 numero=null
04-02 03:24:53.538: E/SQLiteDatabase(32674): android.database.sqlite.SQLiteException: table Inscripcion has no column named rut (code 1): , while compiling: INSERT INTO Inscripcion(nombre,categoria,ticket,codigo_evento,hash,codigo_usuario,validado,rut,talla,sincronizado,inscripcion_id,numero) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)

0 个答案:

没有答案