>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >statement.row bug! http://forum.mozilla-russia.org/viewtopic.php?id=43991 |
Neurostep > 01-04-2010 17:33:13 |
Привет всем! возникла такая ситуация. Я разрабатываю расширение для FF, для его работы нужно хранить некоторую информацию, для хранения выбрал поддержку SQLite. так вот, проблема в том, что в FF 3.6 ниже следующий код работает на ура, а в 3.0.10, Error Console говорит, что statement.row is undefined. В чем проблема? Выделить код Код://подключение к базе var DB = { connect: function() { var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); file.append("имя_файла"); var storageService = Components.classes["@mozilla.org/storage/service;1"] .getService(Components.interfaces.mozIStorageService); return storageService.openDatabase(file); } } //запрос var statement = DB.connect().createStatement("SELECT * FROM users"); //ну и собственно выборка: while(statement.executeStep()) { var id = statement.row.id; var nick = statement.row.nick; } Проверял через SQLite Manager - таблица существует и записи имеются. |
luitzen > 01-04-2010 17:53:36 |
Neurostep пишет
https://developer.mozilla.org/en/Storage#section_12 пишет
Выделено жирным мной . |
Neurostep > 01-04-2010 17:55:57 |
luitzen пишет
luitzen пишет
А можно заюзать метод .step(), будет работать? Спасибо! UPD: все, понятно, не поможет. Спасибо огрмное! |
luitzen > 01-04-2010 18:03:09 |
А ещё AdCentrialIM удалите, он может в довольно неожиданных местах выстреливать, по слухам. |
Neurostep > 01-04-2010 18:12:45 |
luitzen пишет
Хорошо, спасибо Вам еще раз! А не подскажете, какой метод лучше заюзать в моем случае для аналогичной выборки? |
luitzen > 02-04-2010 00:49:37 |
Не знаю, не специалист . Попробуйте так как-нибудь: Выделить код Код:while(statement.executeStep()) { var id = statement.getInt32(0); var nick = statement.getUTF8String(1); } Наверное, можно порыться в истории той страницы, с которой цитата была. |
Neurostep > 02-04-2010 09:30:59 |
Спасибо огромное, поищу) Выделить код Код:var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var browserWindow = wm.getMostRecentWindow("navigator:browser"); при каждом открытии нового окна браузера говорит что это "оно". Выделить код Код:var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation) .QueryInterface(Components.interfaces.nsIDocShellTreeItem) .rootTreeItem .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindow); или пока windowtype не укажешь ничего с точностью в 100% определить не удастся? |
luitzen > 02-04-2010 11:40:32 |
Neurostep пишет
А код с доставанием значения по номеру столбца и приведением к типу в 3.0 не работает? Neurostep пишет
А какое окно вы называете главным? Допустим, мы открыли окно «Настройки», закрыли основное окно, в окне «Настройки» нажали «Справка». Какое окно является главным? Или попробуйте идти до самого верха по .opener, всегда помня последнее окно с "navigator:browser". |
Neurostep > 02-04-2010 11:46:22 |
luitzen пишет
Работает замечательно! luitzen пишет
Когда мы только запустили браузер ) UPD: я так понял, что если .opener равен null, то это как раз то, что мне нужно, правильно? стоит такая задача, чтобы скрипт запускался только при загрузке "главного" окна. То есть скрипт не должен срабатывать при открытии других окон. |
luitzen > 02-04-2010 13:20:02 |
То есть что-то должно делаться в окне только в том случае, если оно на момент запуска единственное? Как-то так, быть может: Выделить код Код:var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); var enum = wm.getEnumerator("navigator:browser"); enum.getNext(); if (!enum.hasMoreElements()) {alert('Мы первые!');} |