QTQUICK LOCKSTORAGE Versione databatch Mismatch (Attributo "Versione" mancante in file INI)

StackOverflow https://stackoverflow.com//questions/23021373

  •  21-12-2019
  •  | 
  •  

Domanda

Sto usando QTQUICK / QML / QT5.2.1 su Android. Ho anche testato questo problema sul desktop piuttosto che Android e vedo lo stesso problema.

Io uso LocalStorage per persistere i dati dell'applicazione dopo la chiusura dell'applicazione.

Apri un database utilizzando openDatabaseSync:

var db = LocalStorage.openDatabaseSync(
    "TestDB",
    "1.0",  <-- version
    "Test Database",
    1000000,
    function(db) {
        createSchema(db);
        populateData(db);
    }
);
.

Se il database non esiste ed è stato creato, la funzione di callback viene eseguita e in tal caso creando lo schema del database e compila il set di dati iniziali.

La prossima volta che l'applicazione inizia, ovviamente voglio mantenere il database AS-è e non ricrearlo.

Il problema è quando riavvio l'applicazione ottengo questo errore:

Error: SQL: database version mismatch
.

Se ispeziona il file .ini creato quando il database è stato creato la prima volta che è stata eseguita l'applicazione, vedo questo:

[General]
Description=Test Database
Driver=QSQLITE
EstimatedSize=1000000
Name=TestDB
Version=
.

Puoi vedere chiaramente un problema qui è che l'attributo "versione" è vuoto.

Quando si avvia l'applicazione, confronta la versione richiesta "1.0" contro questa stringa vuota "e fallisce.

Posso ficcarlo per farlo funzionare ovviamente specificando la versione come "" o fissando il file INI - che almeno mi dice che il codice è altrimenti corretto - ma chiaramente non è una soluzione. Allora, ho perso qualcosa o è un bug Qt?

È stato utile?

Soluzione

È possibile impostare la versione del database dopo averlo creato:

var db = LocalStorage.openDatabaseSync(
    "TestDB",
    "1.0",
    "Test Database",
    1000000,
    function(db) {
        createSchema(db);
        populateData(db);
        db.changeVersion("", "1.0");
    }
);
.

Poiché la funzione di callback verrà chiamata solo il database non esiste e la funzione ChangeVersion funzionerà solo se la versione corrente è "" (altrimenti, l'eccezione viene lanciata), credo che sia sicuro di usarlo.

.

Modifica: Forse questo è il comportamento previsto ... da Codice fonte localStoriage , linea 700:

            if (dbcreationCallback)
                version = QString();
.

Quindi, forse è davvero necessario impostare la versione DB dopo aver creato le tabelle ... Prima di farlo sul callback, è solo un database vuoto e non dovrebbe davvero avere una versione.

Altri suggerimenti

Imposta gli attributi come questo nel tuo codice sopra

 // db = LocalStorage.openDatabaseSync(identifier, version, description, estimated_size, callback(db))
     LocalStorage.openDatabaseSync("kMusicplay", "0.1", "kMusicPlay app Ubuntu", 10000);
.

dove 'KMUSICPLAY' è AppName, '0.1' è la versione, 'KMUSICPLAY APP Ubuntu' è vigilazione app e '10000' è la dimensione del database

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top