2010-11-13 13 views
5

Sto cercando di familiarizzare con Android e la sua API di database. Ho creato una classe che eredita da SQLiteOpenHelper e questo è come creo la tabella nel databaseSQLiteDatabase.insertOrThrow non gira ma non vengono inseriti i dati

@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 funzione utilizzata per aggiungere dati al DB è la seguente implemeneted all'interno della stessa classe è

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(); 
} 

ma apparentemente nessun dato è stato aggiunto. Il valore restituito è sempre 1. Il metodo non lancia, e quando estraggo il DB con adb e guardo il suo contenuto è completamente vuoto.

Non riesco proprio a capire cosa mi manca.

Qualsiasi suggerimento sarebbe apprezzato.

Grazie, S

risposta

-3

risposta di See benritz per la soluzione corretta. Questa risposta non è corretta, ma sfortunatamente non riesco a eliminarla poiché è un post accettato.

/******* NON CORRETTO !!

Poiché si eredita da SQLiteOpenHelper, la chiamata a getWritableDatabase() avvia già una transazione DB. Dal SQLiteOpenHelper API:

transazioni vengono utilizzati per assicurarsi che il database è sempre in uno stato di ragionevole .

Quindi non è necessario chiamare db.beginTransaction() e db.endTransaction(). Quelle chiamate di transazione estranee stanno incasinando i tuoi inserti. Ho inserito lo stesso scenario nel mio progetto e ho scoperto che lo stesso indice (6 nel mio caso), è stato restituito quando si utilizzavano quei metodi di transazione. Quando rimuovo le chiamate ottengo i risultati desiderati (più record inseriti).

NON CORRETTO !! *******/

+1

Grazie mille. Ora funziona. Mi sto davvero chiedendo come si fa a fare casino e perché l'inserto non getta. Comunque, grazie mille! – emitrax

+0

Prego. Penso che non venga generata un'eccezione perché non c'è niente di particolarmente sbagliato nella tua istruzione di inserimento, e non stai violando alcun vincolo di tabella, ecc. Invece le cose si confondono nelle chiamate a più transazioni. Dovrò fare ulteriori ricerche per capire perché la transazione nidificata si comporta come fa. Capisco perché non dovrebbe inserire nulla, ma il fatto che un ID venga restituito è strano. – McStretch

+5

Questo è davvero strano! Il codice sorgente per SQLiteOpenHelper non apre certamente nessuna transazione tranne la creazione e l'aggiornamento del database. Quindi, dopo che la chiamata getWriteableDatabase() restituisce, nessuna transazione è attiva per il database! O qualcosa è veramente fasullo, o questa risposta è falsa. – Nakedible

29

La risposta di McStretch non è corretta. getWritableDatabase() non crea una transazione per il codice, la linea indicata dai documenti si riferisce alle transazioni utilizzate per i metodi onCreate e onUpgrade, il che significa che non è necessario aggiungere il codice transazione in questi metodi. È comunque necessario aggiungere il codice transazione per qualsiasi altro metodo che richiede transazioni.

Il codice di emitrax non funziona correttamente poiché db.setTransactionSuccessful() non viene chiamato, il che significa che la transazione verrà ripristinata da db.endTransaction().

+1

Beh, questo ha molto più senso – Bilthon

+0

Chiaramente, questa è la risposta corretta, non quella di McStretch. – lilbyrdie

Problemi correlati