Domanda

Sono nuovo di SQLite quindi per favore siate pazienti:)

Ho un UITableView la lettura dei dati da un db SQLite. Se elimino un record, la riga nel db viene eliminato. Il problema è che le altre righe mantenere le loro chiavi primarie, così per esempio, ho 3 righe e le chiavi primarie sono 1,2,4. v'è alcuna possibilità di aggiornare le chiavi di essere 1,2,3?

Grazie mille!

modifica: Creo il mio tavolo con:

CREATE TABLE mytable (ID INTEGER PRIMARY KEY  AUTOINCREMENT, value1 TEXT);
È stato utile?

Soluzione

Usa REINDEX . (REINDEX ricostruisce solo la struttura dell'indice, in realtà non modificare i valori di tutti gli indici.)

Utilizzare l'ordinamento delle righe come indice implicito

Piuttosto che cercare di modificare i valori di indice di un intero gruppo di righe, perché non si esegue una mappatura del modo ordinato?

Utilizzare un'istruzione SELECT come:

NSString* query = @"SELECT * FROM myTable ORDER BY id LIMIT 1 OFFSET %d";
query = [NSString stringWithFormat:query, indexPath.row + 1];

Per eliminare una riga fare qualcosa di simile:

NSString* query = @"DELETE FROM myTable WHERE ID = (SELECT ID FROM myTable ORDER BY ID LIMIT 1 OFFSET %d)";
query = [NSString stringWithFormat:query, indexPath.row + 1];

Per inserire, eseguire un inserimento regolare come al solito.

In questo modo, quando si elimina una riga, non si finisce per dover modificare ogni riga che ha un ID più grande della riga che si sta cancellando. Questo sarà molto più veloce.

Assicurati di aggiornare la visualizzazione della tabella ogni volta che un cambiamento nel DB si verifica per mantenere la vista tabella coerente con il DB.

Questo ha anche il simpatico effetto collaterale di mantenere la vista tabella ordinata.

Definisci un trigger di cambiare gli indici colpiti

Se si vuole veramente per mantenere gli indici in modo che siano una serie perfetta (cioè .: 1,2,3,4, ...)

È possibile definire un trigger di eliminazione in questo modo:

CREATE TRIGGER reindex AFTER DELETE ON myTable FOR EACH ROW
BEGIN
    UPDATE myTable SET ID = old.ID - 1 WHERE ID > old.ID;
END;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top