2010-11-13 16 views
5

Estoy tratando de familiarizarme con Android y su base de datos API. He creado una clase que hereda de SQLiteOpenHelper y esto es cómo crear la tabla en la base de datosSQLiteDatabase.insertOrThrow no tira pero no se insertan datos

@Override 
public void onCreate(SQLiteDatabase db) { 

    try { 
     db.execSQL("CREATE TABLE " + FUELS_TABLE_NAME + " (" 
       + "_ID INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + "DATE_OF_FUELS DATE DEFAULT CURRENT_TIME," 
       + "SELLER_POSITION TEXT DEFAULT 'unknown'," 
       + "AMOUNT REAL" 
       + ");" 
     ); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
    } 
} 

La función que se utiliza para agregar datos a la base de datos es la siguiente implemeneted dentro de la misma clase es

public void addNewFuel(float amount) { 

    // Create the content to insert into the database 
    ContentValues newEntry = new ContentValues(); 
    newEntry.put("amount", amount); 

    // Get database handler 
    try { 
     db = getWritableDatabase(); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
     return; 
    } 

    // Begin transaction and insert data 
    long returnedValue; 
    db.beginTransaction(); 
    try { 
     returnedValue = db.insertOrThrow(FUELS_TABLE_NAME, null, newEntry); 
     Log.v(DATABASE_NAME, "return value " + returnedValue); 
    } catch (SQLException e) { 
     Log.e(DATABASE_NAME, e.toString()); 
    } finally { 
     db.endTransaction(); 
    } 

    db.close(); 
} 

pero aparentemente no se han agregado datos. El returnValue es siempre 1. El método no arroja, y cuando saco el DB con adb y miro su contenido, está totalmente vacío.

Simplemente no puedo entender lo que me estoy perdiendo.

Cualquier sugerencia sería apreciada.

Gracias, S

Respuesta

-3

Véase la respuesta de benritz para la solución correcta. Esta respuesta es incorrecta, pero desafortunadamente no puedo eliminarla porque es una publicación aceptada.

/******* NOT CORRECT !!

Dado que hereda de SQLiteOpenHelper, su llamada al getWritableDatabase() ya inicia una transacción DB. Desde el SQLiteOpenHelper API:

Las transacciones se utilizan para asegurarse de que la base de datos está siempre en un estado razonable .

Por lo tanto, no es necesario que llame al db.beginTransaction() y db.endTransaction(). Esas llamadas de transacciones extrañas están estropeando sus insertos. Conecté el mismo escenario en mi proyecto y descubrí que el mismo índice (6 en mi caso) se devolvió al usar esos métodos de transacción. Cuando elimino las llamadas obtengo los resultados deseados (múltiples registros insertados).

NOT CORRECT !! *******/

+1

Muchas gracias. Ahora funciona. Realmente me pregunto cómo llamar a las cosas desordenadas, y por qué la inserción no arroja. De todos modos, muchas gracias! – emitrax

+0

De nada. Creo que no se lanza una excepción porque no hay nada particularmente malo con su declaración de inserción, y no está violando ninguna restricción de tabla, etc. En cambio, las cosas se mezclan en las llamadas a múltiples transacciones. Tendré que investigar un poco más para ver por qué la transacción anidada se comporta de la manera en que lo hace. Entiendo por qué no insertaría nada, pero el hecho de que se devuelva una identificación es extraño. – McStretch

+5

¡Esto es realmente extraño! El código fuente de SQLiteOpenHelper ciertamente no abre ninguna transacción a excepción de la creación y actualización de la base de datos. ¡Entonces, después de que la llamada getWriteableDatabase() retorna, no hay transacciones activas para la base de datos! O algo realmente pervertido está funcionando, o esta respuesta es falsa. – Nakedible

29

La respuesta de McStretch es incorrecta. getWritableDatabase() no crea una transacción para su código, la línea citada de los documentos se refiere a las transacciones que se utilizan para los métodos onCreate y OnUpgrade, lo que significa que no necesita agregar código de transacción en esos métodos. Aún necesita agregar código de transacción para cualquier otro método que requiera transacciones.

El código de emitrax no funciona correctamente ya que db.setTransactionSuccessful() no se está llamando, lo que significa que la transacción se revertirá por db.endTransaction().

+1

Bueno, esto tiene mucho más sentido – Bilthon

+0

Claramente, esta es la respuesta correcta, no la de McStretch. – lilbyrdie

Cuestiones relacionadas