2009-12-16 10 views
11

Ho un database contenente un ID utente e una nota. L'utente non sa se c'è già una nota nel DB in modo che ne scriva uno e faccia clic sul pulsante "Invia". Voglio inserire questa nota se non v'è nota per l'ID utente o l'aggiornamento che nota già esistente userId:Android: c'è un modo migliore per inserire e/o aggiornare una voce del database?

notesDb.open(); 
boolean updateResult = notesDb.updateMessage(
     userId, 
     details_notes_input.getText().toString()); 

if(updateResult == true) { 
    Log.d("databaseTester", "Updated entry into table"); 
} else { 
    Log.d("databaseTester", "FAILED to update entry into table"); 
    long insertResult = notesDb.insertMessage(
      userId, 
      details_notes_input.getText().toString()); 
    if(insertResult == -1){ 
     Log.d("databaseTester", "Failed to insert entry into table"); 
    } else { 
     Log.d("databaseTester", "Inserted entry into table"); 
    } 
} 
notesDb.close(); 

così, sono più o meno il tentativo di 'aggiornamento' una voce e se fallisco, allora tento per "inserirlo". Non conosco SQL molto bene, ma penserei che ci sarebbe un modo migliore. Grazie.

risposta

13

Sembra che si possa usare sqlite REPLACE per risolvere questo problema, utilizzando SQLiteDatabase.replace().

+0

Non ha funzionato per me. Ho provato _getHelper(). GetWritableDatabase(). Replace (TABLE_NAME, null, values); _ Qualche suggerimento? –

+0

È possibile ottenere questa funzionalità tramite 'ContentProvider' utilizzando il passaggio di un parametro aggiuntivo in' ContentValues'. Ho scritto un post sul blog qui: [SQLite INSERIRE O SOSTITUIRE attraverso ContentProvider | Buzzing Android] (http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

1

È possibile rilevare un'eccezione di vincolo avviata in caso di esistenza di ID precedente e quindi aggiornamento.

try { 
    db.insertOrThrow("sometable", null, cv); 
} catch (SQLiteConstraintException e) { 
    db.update("sometable", cv,"sometable_uid =" + id, null); 
} 
+0

L'utilizzo di eccezioni per gestire il flusso di controllo in questo modo non è probabilmente una buona idea. Vedi http://stackoverflow.com/a/729404/504611. –

0

Prova questo risultato

= db.insertWithOnConflict ("tablename", null, cv, -1);

Problemi correlati