Mobile Safari HTML5 WebSQL SQLTransaction генерирует код SQLError = 1 сообщение = «не ошибка», транзакция завершается неудачно - PullRequest
2 голосов
/ 23 февраля 2011

Я пытаюсь заполнить базу данных HTML5 WebSQL из набора операторов SQL, созданных с использованием (sqlite .dump mydb> file.sql)

Я могу прочитать файл и выполнить все операторы SQL. Однако в конце транзакции транзакция завершается с ошибкой SQLError (код = 1, сообщение = «не ошибка»).

Теперь из моих исследований я вижу, что SQLite "не ошибка" - это SQLITE_DONE.

Так почему генерируется SQLError и почему моя транзакция откатывается?

Соответствующий фрагмент Javascript приведен ниже:

database = {

    /* Transaction Error Callback */
    error_callback: function(error)
    {
        console.log('Oops. '+error.message+' (Code '+error.code+')');
    },

    /* Transaction success callback */
    success_callback: function()
    {
        console.log('apparently a success!');
    },

    populate_exec_sql: function(tx)
    {           
        for (var i = 0; i < lines.length; i++)   // lines = Global array of SQL statements
        {
            var query = lines[i].replace(/\n/g,'');
            //console.log(query);
            tx.executeSql(query);
        }
    },

    populate_db: function(lines)
    {
        db.transaction( database.populate_exec_sql, database.error_callback, database.success_callback );
    }
}

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

Хорошо, вот решение.

По сути, webkit / Safari неправильно обрабатывает невероятно описательное и полезное сообщение SQLError: «не ошибка» (вероятно, его следует игнорировать).

Что происходит, если tx.executeSql (query) передается строка без оператора SQL, он возвращает SQLError «не ошибка».

В моем случае это иногда была пустая строка, а иногдастрока только с новой строкой \ n.

Итак, моя функция заполнения теперь выглядит так:

populate_exec_sql: function(tx)
{           
    tx.executeSql('drop table if exists "color"');
    tx.executeSql('drop table if exists "combo"');
    tx.executeSql('drop table if exists "combo_color"');
    for (var i = 0; i < lines.length; i++)
    {
        var query = lines[i].replace(/\n/g, '');       // strip newlines
        query && query.length && tx.executeSql(query); // ignore empty lines
    }
}
0 голосов
/ 23 февраля 2011

Вы смотрели на конкретные запросы, которые терпят неудачу?SQLite не поддерживает тот же синтаксис запроса, что и полный SQL, поэтому (например) выполнение INSERT с использованием UPDATE-подобного синтаксиса не работает.

...