2012-04-14 12 views
5

Sto avendo una tabella con la colonna 'int'. Durante l'aggiornamento del software, voglio cambiarlo in tipo di dati "lunghi". Sembra che SQLite non fornisca un'opzione (in alter istruzioni) per modificare/modificare le proprietà della colonna. Poiché desidero eseguire un aggiornamento, la tabella potrebbe contenere dati che l'utente non dovrebbe perdere. Quindi, per favore suggeriscimi un buon metodo per cambiare la proprietà del tipo di dati della colonna senza perdita di dati.Ho bisogno di un buon metodo per cambiare (SQLite) tipo di dati colonna

Un modo suggerito nei collegamenti di ricerca è creare una tabella temporanea, copiare i record dalla tabella esistente, eliminare la tabella esistente e rinominare la tabella temporanea. Dubito che sia efficiente.

Il vostro aiuto apprezzato!

saluti

Vivek Ragunathan

risposta

10

Ho utilizzato le istruzioni follow per modificare il tipo di colonna.

CREATE TABLE IF NOT EXISTS **TEMP_TABLE** (id integer primary key autoincrement, **col2change integer not null**, ...) 

INSERT INTO TEMP_TABLE SELECT * FROM EXISTING_TABLE 

DROP TABLE EXISTING_TABLE 

ALTER TABLE TEMP_TABLE RENAME TO EXISTING_TABLE 

Ho modificato la colonna di tipo int nella tabella esistente in tipo intero. Per poche centinaia di file, era ragionevolmente veloce.

+0

modo semplice e sicuro – prashantwosti

0

si potrebbe aggiungere un nuovo Colum, copiare i valori formano il vecchio per la nuova colonna, eliminare la vecchia colonna e quindi rinominare la nuova colonna per il vecchio nome

+0

Sembra una buona idea, ma vedere uno dei commenti sopra che si riferisce alla documentazione di SQLite. Dice che una colonna non può essere rinominata o rimossa! –

+0

è possibile rinominare una tabella?allora potresti creare una nuova tabella completa e trasferire i dati –

+0

Sì, lo è. E questa è la mia domanda. È efficiente? Esiste un metodo alternativo per ottenere la modifica del tipo di dati della colonna? –

0

AFAIK c'è il no modo in Android per modificare i tipi di dati delle colonne una volta creata e utilizzata una tabella. Il modo pratico è di creare una nuova tabella e copiare i dati che leggi su

+0

Immagino sia vero, e ci sto provando! –

3

Le colonne SQLite3 non hanno tipi di dati, solo affinities - non c'è alcun vantaggio nel cambiare il tipo di colonna da int a long.

Se un programma wrapper sta troncando i valori prima di assegnarli a SQLite3, è possibile correggerlo modificando lo schema. È un'operazione pericolosa, quindi fallo solo dopo aver eseguito il backup del database. Lo schema è memorizzato nella tabella sqlite_master; normalmente è di sola lettura, ma è possibile modificarlo se lo si abilita con il pragma writable_schema. Fai attenzione a apportare solo modifiche che non invalidano i tuoi dati; è possibile modificare int in long int poiché entrambi hanno affinità INTEGER.

+1

Ma il valore contenuto nella colonna è sensibile a int o long. Se non è lungo, i dati inseriti nella colonna vengono troncati. –

+0

In questo caso non è SQLite3 stesso, ma un'API wrapper che sta troncando i valori. Vedi il mio addendum di risposta. –

+0

Stai utilizzando getLong? Http: //developer.android.com/reference/android/database/Cursor.html#getLong (int)? –

1

Dalla documentazione SQLite

Non è possibile rinominare una colonna, rimuovere una colonna, o di aggiungere o rimuovere i vincoli da una tabella.

Check this link

Si prega di ricordare che i tipi di dati di colonna non sono rigide in SQLite. Check this link

Edit: seguito i tuoi commenti su un'altra risposta, immagino l'opzione che ha citato - lavoro attraverso la tabella temporanea - è l'unico, che non è efficiente fuori rotta.

+0

Il secondo link non funziona! –

+0

Il mio male, ho appena risolto. – ABH

Problemi correlati