2013-04-07 3 views
32

Как удалить всю базу данных IndexedDB из JavaScript, а не только хранилище объектов? Я использую IndexedDB shim, который может использовать WebSQL в качестве своего бэкэнд.Как я могу удалить всю базу данных IndexedDB из JavaScript?

В основном я хотел бы знать, как это сделать для браузера PhantomJS (без головы), хотя Chrome, Safari (на iPad) и IE10 являются другими важными браузерами.

+0

Просто быть любопытным. Почему вы хотите удалить его? – hequ

+1

@hequ Автоматизированные цели тестирования. – aknuds1

+0

Возможный дубликат [Как удалить indexedDB в Chrome] (http://stackoverflow.com/questions/9384128/how-to-delete-indexeddb-in-chrome) – Josh

ответ

60

Насколько я могу судить, следует использовать indexedDB.deleteDatabase:

var req = indexedDB.deleteDatabase(databaseName); 
req.onsuccess = function() { 
    console.log("Deleted database successfully"); 
}; 
req.onerror = function() { 
    console.log("Couldn't delete database"); 
}; 
req.onblocked = function() { 
    console.log("Couldn't delete database due to the operation being blocked"); 
}; 

Я могу подтвердить, что он работает с PhantomJS 1.9.0 и Chrome 26.0.1410.43.

+2

Да, это то, что вы хотите, я использую его в автоматизированных тестах для db.js - https://github.com/aaronpowell/db.js/blob/master/tests/specs/indexes.js#L15 –

+7

Вы должны также добавьте дескриптор заблокированного события: req.onblocked = function() {console.log ("deleteDatbase получил заблокированное событие"); } – dgrogan

0

Я нашел, что следующий код работает нормально, но чтобы увидеть удаленный DB на вкладке Ресурсы Chrome, мне пришлось обновить страницу. Также я обнаружил, что у меня были проблемы с инструментами отладки Chrome, которые выполнялись при выполнении транзакций. Сложнее отлаживать, но если вы закроете его при запуске кода, код, похоже, будет работать нормально. Значительным также является установка ссылки на хранилище объектов при открытии страницы. Очевидно, что удаляемая часть кода находится в методе deleteTheDB.

Код, полученный из примера, предоставленного Craig Shoemaker на Pluralsight.

var IndDb = { 
    name: 'SiteVisitInsp', 
    version: 1000, 
    instance: {}, 
    storenames: { 
     inspRecords: 'inspRecords', 
     images: 'images' 
    }, 
    defaultErrorHandler: function (e) { 
     WriteOutText("Error found : " + e); 
    }, 
    setDefaultErrorHandler: function (request) { 
     if ('onerror' in request) { 
      request.onerror = db.defaultErrorHandler; 
     } 
     if ('onblocked' in request) { 
      request.onblocked = db.defaultErrorHandler; 
     } 
    } 

}; 

var dt = new Date(); 
var oneInspRecord = 
     {    
      recordId: 0, 
      dateCreated: dt, 
      dateOfInsp: dt, 
      weatherId: 0, 
      timeArrived: '', 
      timeDeparted: '', 
      projectId: 0, 
      contractorName: '', 
      DIWConsultant: '', 
      SiteForeman: '', 
      NoOfStaffOnSite: 0, 
      FileME: '', 
      ObservationNotes: '', 
      DiscussionNotes: '', 
      MachineryEquipment: '', 
      Materials: '' 
     }; 

var oneImage = 
{ 
    recordId: '', 
    imgSequence: 0, 
    imageStr: '', 
    dateCreated: dt 
} 


var SVInsp = { 
    nameOfDBStore: function() { alert("Indexed DB Store name : " + IndDb.name); }, 
    createDB: function() { 
     openRequest = window.indexedDB.open(IndDb.name, IndDb.version); 

     openRequest.onupgradeneeded = function (e) { 
      var newVersion = e.target.result; 
      if (!newVersion.objectStoreNames.contains(IndDb.storenames.inspRecords)) { 
       newVersion.createObjectStore(IndDb.storenames.inspRecords, 
        { 
         autoIncrement: true 

        }); 
      } 

      if (!newVersion.objectStoreNames.contains(IndDb.storenames.images)) { 
       newVersion.createObjectStore(IndDb.storenames.images, 
        { 
         autoIncrement: true 
        }); 
      } 
     }; 

     openRequest.onerror = openRequest.onblocked = 'Error'; //resultText; 

     openRequest.onsuccess = function (e) { 
      //WriteOutText("Database open"); 
      IndDb.instance = e.target.result; 
     }; 

    }, 

    deleteTheDB: function() { 
     if (typeof IndDb.instance !== 'undefined') { 
      //WriteOutText("Closing the DB"); 

      IndDb.instance.close(); 
      var deleteRequest = indexedDB.deleteDatabase(IndDb.name) 

      deleteRequest.onblocked = function() { 
       console.log("Delete blocked."); 
      } 

      deleteRequest.onerror = 
       function() { 
        console.log("Error deleting the DB"); 
        //alert("Error deleting the DB"); 
       }; 
       //"Error deleting the DB"; 

      deleteRequest.onsuccess = function() { 

       console.log("Deleted OK."); 
       alert("*** NOTE : Requires page refresh to see the DB removed from the Resources IndexedDB tab in Chrome."); 
       //WriteOutText("Database deleted."); 

      }; 


     }; 

    } 
} 
Смежные вопросы