PhoneGap + jQuery Мобильный доступ к базе данных HTML5 Sqlite в Android 2.1 - PullRequest
3 голосов
/ 16 февраля 2011

Я пытаюсь получить доступ к базе данных HTML5, когда создавал приложение для Android с помощью PhoneGap + jQuery Mobile.Странно, что следующий код может получить разные результаты.Он может получить правильный результат в Galaxy S 2.2 (chris, lulu, chris), но в Cliq TX (Android 2.1) приложение рушится (последнее предупреждение - createTable ()), а в Emulator 2.3 приложение вылетает при первом предупреждении,Я вытащил базу данных и обнаружил, что она правильно создана.Я думаю, что трудно объяснить эти проблемы, почему такие простые коды вызывают так много проблем?У кого-нибудь был успех при доступе к базе данных?

Заранее спасибо.

    function init() {
    alert('init()');
    document.addEventListener("deviceready", onDeviceReady, false);
}

function onDeviceReady() {
    if (!window.openDatabase) {
        alert('Local Databases are not supported.');
    } else {
        db = window
                .openDatabase("YCHW", "1.0", "YCHW", 200000);
    }
    dropTable();
    createTable();
    insertData();
    selectData();
}

function dropTable(){
    alert('dropTable()');
    db.transaction(
        function (transaction) {
            transaction.executeSql("DROP TABLE measurements;", [], nullDataHandler, errorHandler);
        }
    );
    console.log("Table 'measurements' has been dropped.");
    // location.reload();
}

function createTable(){
    alert('createTable()');
    db.transaction(
        function (transaction) {
            transaction.executeSql('CREATE TABLE IF NOT EXISTS measurements(id INTEGER NOT NULL PRIMARY KEY, user TEXT NOT NULL, date TEXT NOT NULL, height INTEGER NOT NULL, weight INTEGER NOT NULL, bmi REAL NOT NULL, abnormal INTEGER NOT NULL);', [], nullDataHandler, errorHandler);
        }
    );
    console.log("Table 'measurements' has been created.");
}

function insertData(){
    alert('insertData()');
    db.transaction(
        function (transaction) {
            var data = ['1','chris','2000-02-22 00:00:00.000','170','60', '20', '0'];
            transaction.executeSql("INSERT INTO measurements(id, user, date, height, weight, bmi, abnormal) VALUES (?, ?, ?, ?, ?, ?, ?)", [data[0], data[1], data[2], data[3], data[4], data[5], data[6]]);
            data = ['2','lulu','2000-02-22 00:00:00.000','170','60', '20.12', '0'];
            transaction.executeSql("INSERT INTO measurements(id, user, date, height, weight, bmi, abnormal) VALUES (?, ?, ?, ?, ?, ?, ?)", [data[0], data[1], data[2], data[3], data[4], data[5], data[6]]);
            data = ['3','chris','2222-02-22 00:00:00.000','170','60', '20.12', '1'];
            transaction.executeSql("INSERT INTO measurements(id, user, date, height, weight, bmi, abnormal) VALUES (?, ?, ?, ?, ?, ?, ?)", [data[0], data[1], data[2], data[3], data[4], data[5], data[6]]);
        }
    );
    console.log("Data has been inserted.");
}

function selectData(){
    alert('selectData()');
    db.transaction(
        function (transaction) {
            transaction.executeSql('SELECT * FROM measurements;', [], dataSelectHandler, errorHandler);
        }
    );
    console.log("Data has been selected.");
}

function dataSelectHandler(transaction, results){
    alert('dataSelectHandler()');
    for (var i=0; i<results.rows.length; i++) {
        var row = results.rows.item(i);
        var measurement = new Object();
        measurement.id   = row['id'];
        measurement.user = row['user'];
        alert(measurement.user);
    }
}

function nullDataHandler(){
    alert('nullDataHandler()');
    console.log("nullDataHandler()");
}

function errorHandler(transaction, error){
    alert('errorHandler()');
    if (error.code==1){
        // DB Table already exists
        alert('DB Table already exists');
    } else {
        // Error is a human-readable string.
        console.log('Oops.  Error was '+error.message+' (Code '+error.code+')');
        alert('Oops.  Error was '+error.message+' (Code '+error.code+')');
    }
    return false;
}

1 Ответ

2 голосов
/ 16 февраля 2011

У меня была похожая проблема, и мое решение заключалось в том, чтобы сделать что-то вроде этого:

Вместо этого:

dropTable();
createTable();
insertData();
selectData();

Я бы связал их, как это:

function (transaction) {
            transaction.executeSql("DROP TABLE measurements;", [], nullDataHandler, errorHandler);
        }, errorHandler, createTable

И так далее, поскольку функция (транзакция) также может использовать обработчики обратного вызова, и вы можете убедиться, что предыдущий оператор полностью выполнен.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...