Como posso salvar o CurrentItem do Picker no QML?

0

Helo, eu defini no mainView as seguintes funções:

property var db: null

function openDB() {
    if(db !== null) return;

    // db = LocalStorage.openDatabaseSync(identifier, version, description, estimated_size, callback(db))
    db = LocalStorage.openDatabaseSync("pedometer.ubik", "0.1", "Simple example app", 100000);

    try {
        db.transaction(function(tx){
            tx.executeSql('CREATE TABLE IF NOT EXISTS settings(key TEXT UNIQUE, value TEXT)');
            var table  = tx.executeSql("SELECT * FROM settings");
            // Seed the table with default values
            if (table.rows.length == 0) {
                tx.executeSql('INSERT INTO settings VALUES(?, ?)', ["Stepslength", "0.7"]);
                tx.executeSql('INSERT INTO settings VALUES(?, ?)', ["Sensivity", "5.2"]);
                console.log('Settings table added');
            };
        });
    } catch (err) {
        console.log("Error creating table in database: " + err);
    };
}


function saveSetting(key, value) {
    openDB();
    db.transaction( function(tx){
        tx.executeSql('INSERT OR REPLACE INTO settings VALUES(?, ?)', [key, value]);
    });
}

function getSetting(key) {
    openDB();
    var res = "";
    db.transaction(function(tx) {
        var rs = tx.executeSql('SELECT value FROM settings WHERE key=?;', [key]);
        res = rs.rows.item(0).value;
    });
    return res;
}

A função saveSetting salva minha configuração. As funções getSetting retornam um valor de configuração.

Agora, quero usar um seletor para salvar a configuração:

Picker {
    id: pickerStepslength
    selectedIndex: parseInt(getSetting("Stepslength")) // this will be set to 0 at the model completion

    delegate: PickerDelegate {
        Label {
            text: modelData
        }
    }

    Component.onCompleted: {
        var stack = [];
        for (var i = 0; i < 4000; i++) {
            stack.push(i / 100.0);
        }
        model = stack;
        // selectedIndex must be set explicitly
        selectedIndex = parseInt(getSetting("Stepslength"))
    }


    onSelectedIndexChanged: {
         saveSetting("Stepslength", selectedIndex)
    }
}

Mas isso não funciona. Não salva o selectedIndex no meu banco de dados.

Ele deve restaurar o selectedIndex do banco de dados.

O que estou fazendo de errado?

    
por ubik 26.08.2015 / 18:00

1 resposta

0

Não tenho 100% de certeza, mas suspeito que o problema é que você está armazenando a conexão com o banco de dados em vez de recuperá-lo sempre que precisar acessar o banco de dados. A documentação do LocalStorage diz: "As conexões do banco de dados são fechadas automaticamente durante a coleta de lixo do Javascript." Isso me faz pensar se a conexão está fechada no final da função openDB() , pois ela não reconhece que a conexão está sendo armazenada em uma propriedade QML.

Eu altero o código para que openDB() chama openDatabaseSync() a cada vez e retorne à conexão do banco de dados com o chamador, que o usará como uma variável local. Este é o padrão que eu sempre vi usado.

Parece que o código de inicialização do seu banco de dados está devidamente protegido, mas pode haver uma abordagem melhor. O primeiro seria passar um retorno de chamada para openDatabaseSync() . Isso só será chamado se o banco de dados for criado agora e uma conexão de banco de dados for passada como um argumento. Assim, o código de inicialização pode ser executado dentro da chamada de retorno. Outra abordagem seria verificar db.version após obter a conexão. Na primeira execução, esta será a string vazia. Em execuções posteriores, ele será definido para o valor passado em openDatabaseSync() . Verificar este valor também é útil para executar atualizações de banco de dados.

Como exemplo, você pode conferir este arquivo QML do meu projeto Beru .

    
por Robert Schroll 26.08.2015 / 23:59