Ошибка недопустимого состояния, исключение DOM 11 в мобильном Safari, вызывающем openDatabase

#javascript #ios #sqlite #exception #mobile-safari

#javascript #iOS #sqlite #исключение #mobile-safari

Вопрос:

У меня есть веб-приложение, которое вызывает openDatabase () при инициализации. Это отлично работает в настольных браузерах Chrome и Safari; однако, когда я пытаюсь открыть приложение в мобильном Safari на iOS 4.3.3, я получаю исключение при первой загрузке страницы:

«Ошибка: INVALID_STATE_ERROR: исключение DOM 11»

Это приводит к сбою в openDatabase () внутри простой функции:

        try {
            if( !window.openDatabase) {
                console.log('SQLite is not supported by this browser');
            }
            else {
                db = openDatabase('MyMobileDb', '1.0', 'MyMobileDb', 65536);
                if (doreset)
                {
                    //my drop and reset DB function
                } else
                {
                    //my init DB function
                }
            }
        }
        catch(e) {
            console.log(e);
        }
  

База данных не создана, и дальнейшее взаимодействие с приложением невозможно. Другие разработчики, работающие с более ранними версиями iOS, не сталкиваются с этой проблемой при использовании того же кода, о котором говорилось. Я также получаю отчеты от нашей команды контроля качества о том, что Android демонстрирует аналогичное поведение. Android 3.1 работает, а 2.2 и 2.1 — нет.

Что я могу сделать, чтобы исправить это?

Комментарии:

1. После некоторого исследования я вижу эту ошибку WebKit , которая выглядит подозрительно причинной.

Ответ №1:

Я понимаю, что в вашем вопросе это не так, но на всякий случай, если кто-то еще наткнется здесь в поисках ответа, у меня была такая же ошибка, и это было потому, что я передавал значение числа для версии вместо строки.

Ответ №2:

У меня есть некоторый код WebSQL, запущенный в автономном мобильном приложении, которое работает в iOS 4.3.3 и Safari для настольных компьютеров нормально.

INVALID_STATE_ERROR: DOM Exception 11 удручающе непрозрачен в том смысле, что он может ссылаться на множество разных вещей, но я подозреваю, что проблема WebKit, на которую вы ссылаетесь, имеет ответ в вашем случае. В любом случае, перейдем к чему-то, что может помочь…

FWIW в моем коде я инициализирую подключение к базе данных через «своего рода» фабрику, и это, кажется, работает нормально, сохраняется во всем моем приложении (фактически, я использую «фабрику» подключения к базе данных плюс второй прототип объекта, который инкапсулирует весь мой SQL, немного похожий на Javascript DAO, но я оставлю это для краткости).

Я создал gist с образцом ‘factory’ в нем (это экстраполяция части моего производственного кода, поэтому приношу извинения за любые упущения): http://gist.github.com/1044759

Этот код инициализирует подключение к вашей базе данных и создаст соответствующие таблицы, если они еще не существуют.

Вот некоторый пример скрипта (возможно, для $(document).ready ), который настроит подключение к БД:

 // Initialise local db
var mydb = new DbConnection().getDb();
  

Чтобы использовать соединение, вы просто вызываете свою обычную транзакцию Javascript, используя mydb в качестве бита базы данных, т.Е.:

 mydb.transaction(function(transaction){
  transaction.executeSql(...
  

Надеюсь, это поможет.

Комментарии:

1. спасибо за совет. Немного поборовшись с этим, я закончил тем, что отказался от всей инфраструктуры WebSQL в пользу веб-хранилища. Локальное / сессионное хранилище работает практически на всех платформах, так что это соответствовало моим потребностям. Если я когда-нибудь вернусь к WebSQL, я обязательно сошлюсь на ваш ответ.

2. Спасибо за обновление. Это, безусловно, похоже на то, что localStorage и IndexedDB являются способами продвижения вперед.