Autore Topic: Come aggiornare il database delle versioni precedenti della mia app?  (Letto 338 volte)

Offline sismouse

  • Utente junior
  • **
  • Post: 69
  • Respect: 0
    • Mostra profilo
Salve, sto per aggiornare perl a prima volta la mia applicazione e vorrei che il database venisse aggiornato nel momento in cui un utente effettua l'aggiornamento dell'app dal Play Store.

Questo è il codice per la creazione del database così come lo avevo concepito sulla prima versione:

Codice: [Seleziona]
public class Database extends SQLiteOpenHelper {
        private static final String DB_NAME = "db";
        private static final int DB_VERSION = 1;
       
        public Database(Context context) {
                super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
                String table = "CREATE TABLE users(";
                table += "_id TEXT PRIMARY KEY,";
                table += "cat TEXT NOT NULL,";
                table += "subcat TEXT NOT NULL,";
                table += "city TEXT NOT NULL,";
               
                String table2 = "CREATE TABLE fav(";
                table2 += "idfav TEXT PRIMARY KEY);";
               
                String table3 = "CREATE TABLE rec(";
                table3 += "id TEXT PRIMARY KEY,";
                table3 += "textit TEXT NOT NULL,";
                table3 += "rate INTEGER NOT NULL,";
                table3 += "data TEXT NOT NULL,";
                table3 += "name TEXT REFERENCES users(_id));";
               
                String table4 = "CREATE TABLE avg(";
                table4 += "id TEXT PRIMARY KEY,";
                table4 += "rec INTEGER NOT NULL,";
                table4 += "media REAL NOT NULL);";
               
                db.execSQL(table);
                db.execSQL(table2);
                db.execSQL(table3);
                db.execSQL(table4);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
}

Questo invece è il nuovo codice per la creazione del database:

Codice: [Seleziona]
public class Database extends SQLiteOpenHelper {
        private static final String DB_NAME = "db";
        private static final int DB_VERSION = 2;
       
        public Database(Context context) {
                super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
                String table = "CREATE TABLE users(";
                table += "_id TEXT PRIMARY KEY,";
                table += "cat TEXT NOT NULL,";
                table += "subcat TEXT NOT NULL,";
                table += "city TEXT NOT NULL,";
                table += "code TEXT,";
               
                String table2 = "CREATE TABLE fav(";
                table2 += "idfav TEXT PRIMARY KEY);";
               
                String table3 = "CREATE TABLE rec(";
                table3 += "id TEXT PRIMARY KEY,";
                table3 += "textit TEXT NOT NULL,";
                table3 += "rate INTEGER NOT NULL,";
                table3 += "data TEXT NOT NULL,";
                table3 += "name TEXT REFERENCES users(_id));";
               
                String table4 = "CREATE TABLE avg(";
                table4 += "id TEXT PRIMARY KEY,";
                table4 += "rec INTEGER NOT NULL,";
                table4 += "media REAL NOT NULL);";
               
                String table5 = "CREATE TABLE cat(";
                table5 += "source TEXT PRIMARY KEY,";
                table5 += "parent TEXT,";
                table5 += "english TEXT NOT NULL);";
               
                db.execSQL(table);
                db.execSQL(table2);
                db.execSQL(table3);
                db.execSQL(table4);
                db.execSQL(table5);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
}

Come potete vedere a differenza del vecchio ho tolto un campo dalla prima tabella (campo "code") e ho aggiunto una quinta tabella.
Sto provando a capire come fare, e oltre ad inserire "2" come versione nel codice nuovo, ho provato a scrivere il metodo onUpgrade:

Codice: [Seleziona]
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                if (newVersion > oldVersion) {       
                        String table5 = "CREATE TABLE cat(";
                        table5 += "source TEXT PRIMARY KEY,";
                        table5 += "parent TEXT,";
                        table5 += "english TEXT NOT NULL);";
                       
                        db.execSQL(table5);
                }
        }

E corretto?
Inoltre come faccio a cancellare solo il campo "code" della prima tabella?

Grazie in anticipo per le vostre risposte.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Come aggiornare il database delle versioni precedenti della mia app?
« Risposta #1 il: 04 Marzo 2015, 19:14:00 CET »
+1
Il comando per modificare una tabella è ALTER TABLE (https://www.sqlite.org/lang_altertable.html), ma non ti permette di rimuovere un campo.

Se non ti dà troppo fastidio puoi lasciarlo, se non lo referenzi mai è come se non ci fosse.
Altrimenti dovresti creare una nuova tabella con una colonna in meno, copiare tutti i dati, cancellare quella originale e rinominare la nuova.
Lo farei in una transaction.

Ciao.

Offline sismouse

  • Utente junior
  • **
  • Post: 69
  • Respect: 0
    • Mostra profilo
Re:Come aggiornare il database delle versioni precedenti della mia app?
« Risposta #2 il: 04 Marzo 2015, 19:15:26 CET »
0
Ok, rinuncio alla cancellazione del campo, tanto non influisce.
Per quanto riguarda il resto, è tutto giusto?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Come aggiornare il database delle versioni precedenti della mia app?
« Risposta #3 il: 05 Marzo 2015, 10:50:50 CET »
+1
Dal punto di vista SQL mi pare di sì.

In Android sarebbe però fortemente consigliato dichiarare il campo _id come INTEGER PRIMARY KEY AUTOINCREMENT in ogni tabella.
Questo dovrebbe servire per far funzionare correttamente i CursorAdapter, non so se ha altre implicazioni.
Se però tutto ti funzionava prima, non credo ci sia problema.

Non ho una conoscenza approfondita dell'argomento, forse qualcun altro può darti maggiori dettagli a riguardo.

Ciao.

Post unito: 05 Marzo 2015, 10:54:10 CET
Scusa, ma riguardando il tuo codice però sembra che tu l'abbia aggiunto code alla tabella e non rimosso... in tal caso devi fare un ALTER TABLE
« Ultima modifica: 05 Marzo 2015, 10:54:10 CET da arlabs, Reason: Merged DoublePost »

Offline sismouse

  • Utente junior
  • **
  • Post: 69
  • Respect: 0
    • Mostra profilo
Re:Come aggiornare il database delle versioni precedenti della mia app?
« Risposta #4 il: 05 Marzo 2015, 22:49:24 CET »
0
Ho sbagliato ad incollare codice, intendevo quello che avevo scritto. In ogni caso ho lasciato così, poco importa.
Grazie per il resto.