2013-10-08 5 views
11

Ho riscontrato che nessuna tabella trovata "nome_tabella" nella mia applicazione caricata dopo l'aggiornamento della versione dell'app. Sono uscito dopo aver testato sto ottenendo questo problema solo dopo l'aggiornamento la vecchia versione di app per nuova versione della app metodocome testare l'aggiornamento del database sqlite prima di caricare la nuova versione della mia app su Play Store in Android

Quello che ho implementato il codice

ho fatto nel ONUPGRADE() e anche aggiornare la versione db nel costruttore ma non ho potuto testarlo nel dispositivo.

fase 1) Aumenta la versione 1 a 2

public databasehelper(Context context) { 

     super(context, DATABASE_NAME, null, 2); 
     this.myContext = context; 
     try { 
      createDataBase(); 
      openDataBase(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

Punto 2) aggiunto nuova tabella in ONUPGRADE() metodo

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

     Log.e("onUpgrade db", ">>>>called"); 
     switch (oldVersion) { 
     case 1: 
      db.execSQL(DATABASE_CREATE_notification_counter); 
      Log.e("db version", ">>>"+oldVersion); 
      // we want both updates, so no break statement here... 
     case 2: 
      Log.e("db version", ">>>"+oldVersion); 
        // I removed onCreate() method from here because new version will already have the new table 
//   onCreate(db); 
     } 

    } 

Fase 3) onCreate() metodo per la nuova versione del database.

@Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DATABASE_CREATE_notification_counter); 
     Log.d("oncreate db", ">>>>called"); 
    } 

ho avuto la soluzione per l'aggiornamento del database link1link2link3link4

Perché non ho potuto testarlo

abbiamo caricato pagato app sul Play Store quindi devo testare db metodo di aggiornamento in emulatore o dispositivo utilizzando due apk diversi significa versione precedente e versione più recente .. e ho provato in prima volta il dispositivo utilizzando la versione precedente e poi la nuova versione (modifiche db con aggiunta nuova tabella in db) ma il metodo onUpgrade() non verrà chiamato in questo momento.

Domanda:

1) Come faccio a testare db aggiornamento prima di aggiornare nuova versione sul negozio gioco?

2) Chiamerà solo quando si aggiorna la versione dal negozio di giochi solo?

Please help me per risolvere questo problema.

Le risposte saranno apprezzate. Grazie in anticipo.

+0

perché non installare semplicemente entrambe le versioni successivamente? Sto avendo problemi a capire cosa manca qui – njzk2

+0

@ njzk2 In realtà ho fatto delle modifiche nel mio codice per aggiornare db quindi non ho potuto semplicemente installare la mia vecchia versione da eclipse direttamente e per la nuova versione che ho testato in entrambi i modi semplicemente installando e con apk firmato ma senza fortuna. – Maulik

+0

non hai la fonte della tua versione precedente ?? – njzk2

risposta

4

Versione di db memorizzata all'interno db. Basta creare un db (db_old) con una versione precedente rispetto a DbHelper. Utilizza DbHelper per connettersi a db_old e il tuo metodo onUpgrade verrà chiamato.

È possibile utilizzare il db esistente come db_old, è sufficiente decrementare la sua versione. Per cambiare versione puoi usare qualsiasi editor db sqlite.

Se non si desidera scrivere test per DbHelper e si desidera simulare l'aggiornamento dell'app, è possibile utilizzare il comando adb install -r. Read more here.

+0

Grazie per la risposta la mia domanda. puoi spiegarmi brevemente dandomi un esempio per capire correttamente? – Maulik

+1

db è solo un file con dati. la versione dei dati è memorizzata nello stesso file. Se vuoi che venga chiamato onUpgrade, devi aprire il tuo file db corrente con l'editor sqlite e diminuire la versione db. La prossima volta che ti connetti a db OnUpgrade verrà chiamato e potrai verificare come funziona. – Leonidos

+0

Puoi anche aumentare la versione di db in DbHelper.E connettiti al tuo db attuale. OnUpgrade dovrebbe essere chiamato. – Leonidos

1

come testare l'aggiornamento del database SQLite senza scaricare nuova versione app dalla Play Store in Android

1) Come posso testare db aggiornamento prima di aggiornare nuova versione sul Play Store?

ho scaricato plugin per il browser SQLite per Eclipse da qui

http://sourceforge.net/projects/sqlitebrowser/

e controllare questo tutorial su come utilizzare plug-SQLite

http://www.coderzheaven.com/2011/04/18/sqlitemanager-plugin-for-eclipse/

basta copiare il barattolo dal 1 ° collegamento e incolla nella cartella di installazione di eclipse chiamata plugin e riavvia eclipse

quindi avviare un emulatore e passare al pacchetto da DDMS e si può visualizzare il database SQLite & controllo se le modifiche apportate alle tabelle esiste o no

+0

scusa fratello, penso che tu non stia capendo correttamente la mia domanda. Voglio testare il mio database delle versioni più recenti prima di caricare apk nel Play Store come una nuova versione di app. – Maulik

+0

Sì, questo è quello che sto cercando di dirti, dopo aver apportato delle modifiche alle tue tabelle di database e prima di caricare per giocare, usa il browser sqlite per verificare se il tuo nuovo database modificato funziona o meno –

+0

Ho già plugin per il gestore di sqlite per Firfox. E ho già provato con sqlite manager ma il mio metodo onupgrade() non deve essere chiamato così non è possibile creare la mia nuova tabella dopo aver aggiornato il mio database. – Maulik

1

È possibile installare apk da fonte diversa Playstore (se si tratta di abilitato sul tuo telefono). Il modo più semplice per inviarlo al telefono via e-mail o copiare l'apk tramite cavo USB.

3

Dopo lunga ricerca e sperimentazione la mia domanda, finalmente ...

ho ottenuto che funziona! Nella CreateDatabase classe una linea mancava:

ho appena aggiunto sotto la linea nel mio codice CreateDatabase()

this.getWritableDatabase(); 

Dobbiamo dare il permesso di scrivere database mentre creiamo base di dati, questa autorizzazione darà il permesso di scrivere il database mentre aggiorniamo l'applicazione dal Play Store.

Una volta aperto con successo, il database è memorizzato nella cache, in modo da poter chiamare questo metodo ogni volta che è necessario scrivere al database. (Assicurati che chiami close() quando non hai più bisogno del database.) Errori come le autorizzazioni errate o un disco completo possono causare il fallimento di questo metodo, ma i tentativi futuri di possono riuscire se il problema è risolto.

L'aggiornamento del database potrebbe richiedere molto tempo, non è necessario chiamare questo metodo dal thread principale dell'applicazione, incluso da ContentProvider.onCreate().

public void createDataBase() throws IOException 
     { boolean dbExist = checkDataBase(); 
      if (!dbExist) { 
      this.getReadableDatabase(); 
      try { 
       // ---If not created then copy the database--- 
       copyDataBase(); 
      } catch (IOException e) { 
       throw new Error("Error copying database"); 
      } 
      } 
      else { 
      /* This line: that has been solve my problem */ 
      this.getWritableDatabase(); 
      } 
     } 

pubblico OpenDatabase void() throws SQLException {

 // --- Open the database---   String myPath = path + DATABASE_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READWRITE); // you also have to add open_readwrite condition here 
       /*onUpgrade(myDataBase, 1, 2);*/ // no need to call upgrade  here it will be called automatically 

    } 

Devi dare condizione di lettura e scrittura, mentre aperto il database.

Inoltre onUpgrade() viene chiamato quando viene creato un nuovo oggetto della classe DataBaseHelper ma solo se i numeri di versione del database non corrispondono. Questo significa che non è necessario chiamare su Aggiornamento "da solo". Se pubblichi un aggiornamento del tuo db, basta incrementare la versione nr di uno e applicare le modifiche nel metodo onUpgrade() -.

ho preso dal link indicato:

onUpgrade database - oldVersion - newVersion

auguriamo che questo aiuta chiunque per sviluppatore futuro!