【问题标题】:Populating data in objectstore , delets data from other object store in IndexedDB在 objectstore 中填充数据,从 IndexedDB 中的其他对象存储中删除数据
【发布时间】:2014-10-13 04:00:04
【问题描述】:

我需要在 IndexedDB 数据库中创建七个对象存储。我一一创建它们并在每个创建事务完成后填充它们。我从 ajax 调用返回的数据填充每个对象存储。

在 JS 执行结束时,我可以看到所有七个对象存储都已创建,但只有最后一个有数据。在调试模式下,我观察到每个都被填充,但同时,我不知道以前填充的对象存储中的数据是如何被删除的。

谢谢。 南迪塔

【问题讨论】:

  • 你需要分享一些代码。

标签: indexeddb


【解决方案1】:

我发现这个问题的原因是 创建每个对象存储后调用 transaction.oncomplete 会覆盖它。因此,只有最后分配的函数调用才能得到正在执行的 .这导致只填充最后一个对象存储,而不是前一个。

【讨论】:

    【解决方案2】:

    这是完整的 javascript 代码:

    function openAddressDB(){
    
    if (!window.indexedDB) {
      window.alert("Your browser doesn't support a stable version of IndexedDB. Can't store address data in web storage");        
    } else {
      // Let us open address database
      var request = window.indexedDB.open(Address_DB_Name, Address_DB_Version);
    
      //Sucess event handler
      request.onsuccess = function(event) {
        addressDb = request.result; 
    
        refreshAddressList();      
    
        // Generic error handler for all errors targeted at this database's requests!
        addressDb.onerror = function(event) {          
          alert(Address_DB_Name + " error: " + event.target.errorCode);
        };
      };
    
      // If some other tab is loaded with the database, then it needs to be closed
      // before we can proceed.
      request.onblocked = function(event) {  
        alert("Need to update "+Address_DB_Name+" database, please close all other tabs with this site open!");
      }; 
    
      //Error event handler
      request.onerror = function(event) {
         alert("Open "+Address_DB_Name+" failed:" + event.target.errorCode );
      };
    
      //upgrade event handler
      request.onupgradeneeded = function (evt) { 
        addressDb =  evt.currentTarget.result;
    
        //delete object store if database is upgrading
        if (event.oldVersion != 0){
    
          if(addressDb.objectStoreNames.contains(Address1_Store)) {
             addressDb.deleteObjectStore(Address1_Store);
          }
    
          if(addressDb.objectStoreNames.contains(Address2_Store)) {                     
            addressDb.deleteObjectStore(Address2_Store);
          }
    
          if(addressDb.objectStoreNames.contains(Address3_Store)) {
            addressDb.deleteObjectStore(Address3_Store);
          }
          if(addressDb.objectStoreNames.contains(Town_City_Store)) {
            addressDb.deleteObjectStore(Town_City_Store);
          }
          if(addressDb.objectStoreNames.contains(County_Store)) {
            addressDb.deleteObjectStore(County_Store);
          }
          if (addressDb.objectStoreNames.contains(State_Store)) {
           addressDb.deleteObjectStore(State_Store);
          }
          if  (addressDb.objectStoreNames.contains(Post_Code_Store)) {
           addressDb.deleteObjectStore(Post_Code_Store);
          }
          if  (addressDb.objectStoreNames.contains(Country_Store)) {
           addressDb.deleteObjectStore(Country_Store); 
          }
          if  (addressDb.objectStoreNames.contains(Region_Store)) {
           addressDb.deleteObjectStore(Region_Store);                      
          }
        }           
    
        //creating object store  and store data
    
        //Address 1               
        $("#addressview").find("[name='address1id']").each(function(index){ 
            address1Store =addressDb.createObjectStore(Address1_Store,{ keyPath: "id" });
            // Create an index to search on 
            address1Store.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
            address1Store.transaction.oncomplete = function(event){                   
                loadAddressList('address1id', 'Address1')           
              };
        });      
    
        //Address 2
        $("#addressview").find("[name='address2id']").each(function(index){               
            address2Store =addressDb.createObjectStore(Address2_Store,{ keyPath: "id" });
            address2Store.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
            address2Store.transaction.oncomplete = function(event){                     
                loadAddressList('address2id','Address2')           
              };
        }); 
    
       
    
        //Address 3
        $("#addressview").find("[name='address3id']").each(function(index){                    
          address3Store =addressDb.createObjectStore(Address3_Store,{ keyPath: "id" });
          address3Store.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          address3Store.transaction.oncomplete = function(event){                
              loadAddressList('address3id','Address3')           
            };
        });    
    
        //Town/City
        $("#addressview").find("[name='towncityid']").each(function(index){               
          townCityStore =addressDb.createObjectStore(Town_City_Store,{ keyPath: "id" });
          townCityStore.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          townCityStore.transaction.oncomplete = function(event){                     
              loadAddressList('towncityid','TownCity')           
            };
        });     
    
        //county
        $("#addressview").find("[name='countyid']").each(function(index){  
          countyStore =addressDb.createObjectStore(County_Store,{ keyPath: "id" });
          countyStore.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          countyStore.transaction.oncomplete = function(event){                  
              loadAddressList('countyid','County')           
            };
        });    
    
        //state
        $("#addressview").find("[name='stateid']").each(function(index){
          stateStore =addressDb.createObjectStore(State_Store,{ keyPath: "id" });
          stateStore.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          stateStore.transaction.oncomplete = function(event){                     
            loadAddressList('stateid','State')           
          };
        });    
    
        //Postal Code
        $("#addressview").find("[name='postalcodeid']").each(function(index){     
          postalCodeStore =addressDb.createObjectStore(Post_Code_Store,{ keyPath: "id" });
          postalCodeStore.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          postalCodeStore.transaction.oncomplete = function(event){                
            loadAddressList('postalcodeid','PostalCode')           
          };
        });    
    
        //Country 
        $("#addressview").find("[name='countryid']").each(function(index){           
          countryStore =addressDb.createObjectStore(Country_Store,{ keyPath: "id" });
          countryStore.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          countryStore.transaction.oncomplete = function(event){           
              loadAddressList('countryid','Country')           
            };
        });   
    
        //Region
        $("#addressview").find("[name='regionid']").each(function(index){    
          regionStore =addressDb.createObjectStore(Region_Store,{ keyPath: "id" });
          regionStore.createIndex("parentAddressListValueId", "parentAddressListValueId", { unique: false });
          regionStore.transaction.oncomplete = function(event){                    
              loadAddressList('regionid','Region')           
            };
        });
    
        addressDb.onversionchange = function(event) {
          alert(Address_DB_Name+' database change has occurred; you should refresh this browser window, or close it down and use the other '+ 'open version of this application, wherever it exists.');
        };       
    
        window.location.reload();
      }; // onupgradeneeded
     }//else
    } // function openAddressDB()
    
    function loadAddressList(fieldName,address_field) {   
        $.ajax({
               type: "GET",
               url: "/settings/address_lst_values/"+address_field,
               data: {},
               beforeSend: function() {
                  $('#address_loading').show();
               },
               complete: function() {
                  $('#address_loading').hide();
               },
               success: function(data, status, jqXHR)
               {                
                if (anyAjaxError(data, status, jqXHR) === false)
                { 
                  //store in browser object store
                  var store = getObjectStore(fieldName, 'readwrite');                                       
                  for (var i in data) {                    
                    store.add(data[i]);
                  }                                                                              
                }                  
                $('#address_loading').hide();
               },
               error : function(jqXHR, status, errorThrown )
               {
                ajaxCallFail(jqXHR, status, errorThrown,"Error while loading "+address_field +"data")
               }              
        }); // ajax call to load address list     
    }// function load address list
    

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2017-09-05
      • 2012-02-25
      • 2014-11-24
      • 1970-01-01
      相关资源
      最近更新 更多