如何用js删除IndexedDB旧版本的数据库?

时间:2015-09-20 08:57:17

标签: javascript indexeddb

我使用像这样的

创建indexedDB
  var getIndexedDB = function() {
  if ( !indexedDB ) {
    indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.oIndexedDB || window.msIndexedDB || ((window.indexedDB === null && window.shimIndexedDB) ? window.shimIndexedDB : undefined);

    if ( !indexedDB ) {
      throw 'IndexedDB required';
    }
  }
  return indexedDB;
};

在部署时更改数据库的版本。但是如果查看文件的大小(保存浏览器indexedDB),他们会添加新数据而不是删除旧数据。 需要通过js检查indexedDB是否包含旧版本的数据库,并且只丢弃(通过js!)旧版本(不是所有数据库)。

2 个答案:

答案 0 :(得分:3)

一些起始字节:
使用您提到的getIndexedDB(),您将只获得IDB的持有者,它不会打开数据库进行存储。您需要使用以下代码打开IDB实例:

var request = window.indexedDB.open(DB_NAME, DB_VERSION, {storage: "temporary"});

此外,我个人不建议使用webkitIndexedDBmozIndexedDB之类的IDB前缀,除非您有充分的理由使用前缀。详细了解IDB prefix from Mozilla

  

请注意使用前缀的实现可能有问题,或者   不完整的,或遵循规范的旧版本。

删除IDB实例
打开数据库后,可以使用IDBFactory.deleteDatabase()删除数据库,阅读更多here

但请注意,如果为同一个应用程序打开了2个选项卡,这意味着同一个数据库的2个IDB实例,则无法删除数据库,因为db实例将进入阻塞状态。您可以尝试使用deleteDatabase(),在关闭其他选项卡之前,您将看到数据库删除操作无效。尝试使用下面的代码,你将数据库进入阻塞状态,下面是如何使用JS代码删除IDB数据库。

var DBDeleteRequest = window.indexedDB.deleteDatabase("toDoList");
DBDeleteRequest.onblocked = function(event) {
    alert("Error message: Database in blocked state. ");
};
DBDeleteRequest.onerror = function(event) {
  console.log("Error deleting database.");
};

DBDeleteRequest.onsuccess = function(event) {
  console.log("Database deleted successfully");

  console.log(request.result); // should be null
};

IDB版本:
我个人不建议每次进行新的部署时更改IDB版本,否则用户浏览器最终会有很多IDB实例。

IDB中的版本主要是支持IDB架构的运行时操作。假设您要添加一些新的列/存储,从现有存储中删除一些索引等,那么您应该将版本增加一个并执行数据库模式操作。

清除浏览器缓存,IDBFactory.deleteDatabase()是删除IDB实例的2种机制。

以下是处理打开和删除IDB的方法,但我们知道您应该/可以使用localStorage来检查何时需要打开数据库以及何时删除+打开。

     var dbDeleteRequest = window.indexedDB.deleteDatabase("toDoList");
    dbDeleteRequest.onerror = function(event) {
        console.log("Error while deleting database.", true);
    };

    dbDeleteRequest.onsuccess = function(event) {
        console.log("Success while deleting database.", true);
        // Let us open our database
        var DBOpenRequest = window.indexedDB.open("toDoList", 5);

        DBOpenRequest.onsuccess = function(event) {
          console.log('<li>Database initialised.</li>');
        };

        DBOpenRequest.onupgradeneeded = function(event) {
          console.log('<li>DBOpenRequest.onupgradeneeded</li>');
        };
    };

答案 1 :(得分:0)

在我的案例解决方案中,在打开新连接进行工作之前检查现有版本是否为实际版本。如果没有实际删除所有数据库,请在打开新连接之前。

Runnable r = new Runnable() {
        @Override
        public void run() {

            long futuretime = System.currentTimeMillis()+10000;

            while(System.currentTimeMillis()<futuretime){
                synchronized (this){

                    try {
                        wait(futuretime - System.currentTimeMillis());
                    } catch (Exception e) {}
                }
            }

try {
                     // code runs in a thread
                     runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
           TextView time = (TextView)findViewById(R.id.timedisplay);
        time.setText("Changed Man!!");
                            }
                     });
               } catch (final Exception ex) {
                   Log.i("---","Exception in thread");
               }
        }
    };

    Thread thread = new Thread(r);
    thread.start();