Почему мой обратный вызов onupgradeneeded никогда не вызывается при подключении к indexedDB?

Я пытаюсь получить некоторые данные, хранящиеся локально, с помощью IndexedDB. Ниже у меня есть простой пример, с помощью которого я пытаюсь запустить событие onupgradeneeded.

<html>
  <head>
    <script>

      var indexedDB = window.indexedDB || window.webkitIndexedDB 
                    ||window.mozIndexedDB||window.msIndexedDB;

      var request = indexedDB.open("mydb",2),    

      customerData=[
        {ssn:"444-44-4444",name:"Bill",age:35,email:"[email protected]"},      
        {ssn:"555-55-5555",name:"Donna",age:32,email:"[email protected]"}
      ];

      request.onerror = function(event){
         alert("ERROR") ;
      };
      request.onupgradeneeded = function(event) {
         alert("UPGRADE NEEDED") ;
         var objectStore = db.createObjectStore("customers",{keyPath:"ssn"});
         objectStore.createIndex("name","name",{unique:false});
         objectStore.createIndex("email","email",{unique:true});

         for(var i in customerData){
            objectStore.add(customerData[i]);
         }
      } ;
      request.onsuccess = function(e) {
         alert("SUCCESS") ;
      } ;
    </script>
  </head>
</html>

Я пытался изменить номер версии, но все, что я пытаюсь сделать для обновления, никогда не вызывается/не запускается. Любые предложения, почему?

ура Лука


person Jeanluca Scaljeri    schedule 01.02.2012    source источник


Ответы (2)


Я проверил это в FF 10, и это сработало для меня. (Пока код не попытался использовать неопределенную переменную «db».)

Какой браузер вы используете? Событие upgradeneeded возникает только в FF 10. Chrome 16 по-прежнему использует старый черновик, в котором вам нужно проверить свойство db.version и вызвать db.setVersion, если это не то, что вам нужно.

Если вы используете FF10, вы уверены, что «mydb» еще не создан?

Кроме того, убедитесь, что вы тестируете это на реальном веб-сервере. FF не позволит вам использовать indexedDB с локальными файлами HTML. Если это происходит, вы должны увидеть в консоли сообщение об ошибке типа «Операция завершилась неудачно по причинам, не связанным с самой базой данных и не охватываемым каким-либо другим кодом ошибки».

person Jason Diamond    schedule 07.02.2012
comment
проверьте, я обновился с 6.x до 10, и теперь он работает нормально! Я тестировал этот материал раньше на chrome 17, который не работает (также не работают сафари/опера), спасибо!! - person Jeanluca Scaljeri; 15.02.2012

Вы не определили переменную db

У меня такая же проблема... это код из MDN, и они не объяснили, как обновить версию БД без функции setVersion()

person jsbuster    schedule 01.02.2012
comment
Я думаю, они объяснили, что с помощью indexedDB.open(mydb,2) вы можете определить свою версию БД. Если эта версия не соответствует версии БД, вызывается onupgradeneeded. Это то, что я отметил в их документации, и звучит очень логично, за исключением того, что это не работает :) - person Jeanluca Scaljeri; 01.02.2012
comment
Я предполагаю, что вы получаете БД через: var db = event.target.result ; Но поскольку onupgradeneeded никогда не вызывается, вы не получите ошибку - person Jeanluca Scaljeri; 02.02.2012
comment
если вам когда-нибудь удастся решить эту проблему, будет очень полезно, если вы опубликуете ее здесь... - person jsbuster; 03.02.2012