Autore Topic: Modificare trigger  (Letto 1063 volte)

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Modificare trigger
« il: 25 Agosto 2013, 23:20:14 CEST »
0
ciao a tutti, stò utilizzando un TRIGGER che mi permette di inserire dei valori di una tabella in un'altra.....
ora ho la necessità di modificarlo ed inserire un nuovo campo, esiste un modo per far modificare il TRIGGER nelle versioni precedenti del DB??
(ad esempio come si fà con ALTER TABLE per modificare una tabella)

Offline matttt

Re:Modificare trigger
« Risposta #1 il: 26 Agosto 2013, 13:27:47 CEST »
0
Che query usi per creare il trigger?
Per aggiornarlo non puoi semplicemente distruggerlo (DROP TRIGGER ...) e ricrearlo?
SQLite Query Language: DROP TRIGGER
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #2 il: 26 Agosto 2013, 18:06:10 CEST »
0
Allora, nell' OnUpgrade ho inserito
Codice (Java): [Seleziona]
  db.execSQL("DROP TRIGGER nome_trigger;");poi ho eliminato "manualmente" il trigger ed ho riscritto quello nuovo e cambiato la versione del db.

il trigger nuovo è scritto così(in pratica è uguale a quello vecchio ma con 1 campo in più) ma testando l'app nel dispositivo (quindi installando il nuovo aggiornamento)va in crash
Codice (Java): [Seleziona]
builder = new StringBuilder();
                builder.append("CREATE TRIGGER IF NOT EXISTS aggiungi_bolletta_nuovo AFTER INSERT ON Bollette FOR EACH ROW WHEN (new.importo > 0) ");
                builder.append("BEGIN ");
                builder.append("INSERT INTO Giornate (data, uscita, note) VALUES (new.data, new.importo, new.fornitore); ");
                builder.append("END;");
               
                db.execSQL(builder.toString());

Offline matttt

Re:Modificare trigger
« Risposta #3 il: 26 Agosto 2013, 18:26:51 CEST »
0
Ti mancano gli "a capo" nella query.
L' append() di StringBuilder non te li aggiunge.
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #4 il: 26 Agosto 2013, 18:33:19 CEST »
0
Scusa come a capo??...il vecchio trigger è identico, ho solo aggiunto
Codice (Java): [Seleziona]
new.fornitore e funzionava perfettamente....

Offline matttt

Re:Modificare trigger
« Risposta #5 il: 26 Agosto 2013, 18:55:15 CEST »
0
Scusa come a capo??...il vecchio trigger è identico, ho solo aggiunto
Codice (Java): [Seleziona]
new.fornitore e funzionava perfettamente....
Strano... non pensavo che accettasse una query del tipo "... BEGIN  INSERT ..."

In LogCat che compare?
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #6 il: 26 Agosto 2013, 19:15:46 CEST »
0
infatti è come dici tu, ma allora perchè con 1 campo in meno funzionava correttamente??
Codice (Java): [Seleziona]
08-26 17:14:41.697: E/AndroidRuntime(2637): java.lang.RuntimeException: Unable to start activity ComponentInfo{bilancio.personale/it.della90.bilancio.MainActivity}: android.database.sqlite.SQLiteException: near "BEGININSERT": syntax error (code 1): , while compiling: CREATE TRIGGER IF NOT EXISTS aggiungi_bolletta_nuovo AFTER INSERT ON Bollette FOR EACH ROW WHEN (new.importo > 0) BEGININSERT INTO Giornate (data, uscita, note) VALUES (new.data, new.importo, new.fornitore); END;
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.os.Looper.loop(Looper.java:137)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at java.lang.reflect.Method.invokeNative(Native Method)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at java.lang.reflect.Method.invoke(Method.java:511)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at dalvik.system.NativeStart.main(Native Method)
08-26 17:14:41.697: E/AndroidRuntime(2637): Caused by: android.database.sqlite.SQLiteException: near "BEGININSERT": syntax error (code 1): , while compiling: CREATE TRIGGER IF NOT EXISTS aggiungi_bolletta_nuovo AFTER INSERT ON Bollette FOR EACH ROW WHEN (new.importo > 0) BEGININSERT INTO Giornate (data, uscita, note) VALUES (new.data, new.importo, new.fornitore); END;
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
08-26 17:14:41.697: E/AndroidRuntime(2637):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)

Offline matttt

Re:Modificare trigger
« Risposta #7 il: 26 Agosto 2013, 19:21:07 CEST »
0
Sei sicuro che il codice fosse esattamente lo stesso (con un campo in meno ovviamente) ?
Intendo sempre 4 richiami ad append(), stesse stringhe aggiunte, etc.
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #8 il: 26 Agosto 2013, 19:30:51 CEST »
0
guarda questo è il veccchio:
Codice (Java): [Seleziona]
//builder = new StringBuilder();
                //builder.append("CREATE TRIGGER IF NOT EXISTS aggiungi_bolletta AFTER INSERT ON Bollette FOR EACH ROW WHEN (new.importo > 0) ");
                //builder.append("BEGIN ");
                //builder.append("INSERT INTO Giornate (data, uscita) VALUES (new.data, new.importo); ");
                //builder.append("END;");
               
                //db.execSQL(builder.toString());
e questo il nuovo
Codice (Java): [Seleziona]
builder = new StringBuilder();
                builder.append("CREATE TRIGGER IF NOT EXISTS aggiungi_bolletta_nuovo AFTER INSERT ON Bollette FOR EACH ROW WHEN (new.importo > 0) ");
                builder.append("BEGIN");
                builder.append("INSERT INTO Giornate (data, uscita, note) VALUES (new.data, new.importo, new.fornitore); ");
                builder.append("END;");
               
                db.execSQL(builder.toString());

Offline matttt

Re:Modificare trigger
« Risposta #9 il: 26 Agosto 2013, 19:46:27 CEST »
0
Ma... 2 o 3 post fa hai scritto come seconda riga nuova:
Codice (Java): [Seleziona]
builder.append("BEGIN "); (con lo spazio finale)
La questione forse è solo quello spazio dopo il BEGIN, magari ti accetta anche la query senza l' "a capo" ma ovviamente lo spazio è necessario.
Eventualmente puoi fare un test con adb shell, entri in sqlite3 ed esegui le varie query con e senza a capo.
« Ultima modifica: 26 Agosto 2013, 20:10:33 CEST da matttt »
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #10 il: 26 Agosto 2013, 23:16:48 CEST »
0
ok in parte o risolto e cioè: se installo la nuova app senza avere quella vecchia (quindi senza fare l'aggiornamento) tutto funziona.
Quindi a questo punto il problema dovrebbe essere nel drop trigger giusto?? l'ho fatto così
Codice (Java): [Seleziona]
@Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                           
                 if (newVersion > oldVersion) {  
               // db.execSQL("ALTER TABLE Giornate ADD COLUMN note TEXT");  
                db.execSQL("DROP TRIGGER aggiungi_bolletta;");
           }  
                }
ma è un'istruzione talmente semplice che credo sia impossibile da sbagliare..

Offline matttt

Re:Modificare trigger
« Risposta #11 il: 26 Agosto 2013, 23:20:32 CEST »
0
Bene.
Il punto e virgola finale nella query non ti serve
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #12 il: 26 Agosto 2013, 23:23:46 CEST »
0
quale scusa?? se lo tolgo dà errore 8-)

Offline matttt

Re:Modificare trigger
« Risposta #13 il: 26 Agosto 2013, 23:33:45 CEST »
0
Dicevo:
Codice (Java): [Seleziona]
db.execSQL("DROP TRIGGER aggiungi_bolletta");
Ti da errore??
Le mie apps su Google Play Store:

Offline Kecco11

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    GS4
Re:Modificare trigger
« Risposta #14 il: 26 Agosto 2013, 23:41:22 CEST »
0
No scusa non dà errore ma non funziona se faccio l'aggiornamento...invece è ok se installo solamente questa versione..
Cavolo come ne esco???