#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
являются способами продвижения вперед.