2013-10-04 16 views
11

Ho una strega WCF che fornisce alcuni dati JSON e quindi la salverò nel database locale. Funziona bene Possiedo un'attività che riempie i dati da un database locale a un listview che funziona bene.Qual è il modo migliore in Android per eliminare tutte le righe da una tabella

public void fillData() { 

    // Fields from the database (projection) 
    // Must include the _id column for the adapter to work 
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY }; 
    // Fields on the UI to which we map 
    int[] to = new int[] { R.id.label }; 

    getLoaderManager().initLoader(0, null, this); 
    adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from, 
      to, 0); 

    lw.setAdapter(adapter); 
} 

Quello che non riesco a capire è quale sarebbe il modo migliore per eliminare tutte le righe prima di un'azione di sincronizzazione da un WCF.

ho potuto farlo ottenendo tutti Id di dal database poi trovare la riga URI e quindi usare:

getContentResolver().delete(uri, null, null) 

Penso solo che ci deve essere un modo migliore che ho visto molti esempi in rete che utilizza la classe DBHelper ma non riesco a capire come accedere alla classe DBHelper dall'attività o sopra il ContentProvider

speranza che abbia un senso

+3

se avete proprio ContentProvider poi 'getContentResolver(). Delete (URI, null, null)' è ok ... ma. .. uri non dovrebbe puntare a specifici "item" ma piuttosto a interi "dir" ('content: // com.authority/tablename/111' <= item uri,' content: // com.authority/tablename' <= dir uri) – Selvin

+0

non hai bisogno di trovare tutti gli id ​​del database se lo fai in questo modo. Tutto quello che devi fare è dargli l'uri del database e non un articolo specifico – tyczj

+0

scusate se mi è stato detto che sono newbish :(@Selvin. La tua risposta è stata fatta. Ty. Fai una risposta così posso farlo eccetto il codice corretto è: 'getContentResolver(). delete (TodoContentProvider.CONTENT_URI, null, null);' – Jester

risposta

28

Usando DatabaseHelper si può fare in questo modo:

dbHelper = new DatabaseHelper(context); 
database = dbHelper.getWritableDatabase(); 

public void clearTable() { 
    database.delete(TABLE, null,null); 
} 
+0

tuttavia cancella l'intera tabella? Ho ancora bisogno di tabella voglio solo cancellare righe fuori –

+1

@Tininneratore Zea questo eliminerà solo tutte le righe dalla tabella data. Maggiori informazioni: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#delete(java.lang.String, java.lang.String, java.lang.String []) – Kristopher

+0

questo è non ottimale perché non notifica la modifica dei dati. è necessario sovrascrivere il metodo di eliminazione nel provider di contenuti – hadi

-1

Se si desidera solo per eliminare tutte le righe in una tabella:

drop table if exists "tablename" 

E quindi ricreare la tabella con le colonne appropriate. Personalmente trovo molto più facile farlo in questo modo.

+0

Questa non è una grande idea, dal momento che è necessario mantenere diverse versioni della query della tabella di creazione se si prevede di aggiornare il DB. – npace

+0

Solitamente ho adottato un approccio di patch, manterrai la vecchia creazione e applicherò alla tabella tutte le istruzioni di aggiornamento necessarie. Quindi puoi applicare tutte le dichiarazioni sulla creazione (fallo sicuro se non è applicabile) e tenerle aggiornate per il lancio. Questo però non funziona bene su una configurazione multi-istanza (dove si vorrebbe che il db centrale sia impostato correttamente in anticipo) – Rogue

+0

Questa non è una buona idea per cancellare la tabella. Tuttavia è possibile trovare una soluzione semplice tramite la propria query di eliminazione SQL. – Mahmudul

6

Prova

<your-SQLite-instance>.execSQL("DELETE FROM <table_name>"); 

che vi porterà tutte le righe da <table_name>

+1

leggi documentazione: execSQL() Esegui una singola istruzione SQL che NON è SELECT/INSERT/UPDATE/** DELETE **. – Selvin

+1

@Selvin dovresti leggerlo anch'io, questo è per 'execSQL (String sql, Object [] bindArgs)' NOT per 'execSQL (String sql)'. Il codice che ho postato è usato in produzione, e funziona ... – bclymer

+1

ok così: 'Non ha modo di restituire alcun dato (come il numero di righe interessate) .' DELETE restituisce il numero di affected' Il codice che ho postato è usato in produzione, e funziona', ma dovresti essere incoraggiato a usare insert/update/delete (come indicato in 'execSQL (String sql)' doc) – Selvin

2

Provare a utilizzare questo codice per eliminare tutte le righe di una tabella :

database.delete(tablename, null,null); 

Basta sostituire database per il nome db e tablename per la tabella che si desidera eliminare le righe

Problemi correlati