我一直关注页面Using IndexedDB。
加载页面后,我创建/加载数据库。
window.App = window.App || {};
App.db = window.indexedDB.open("myapp", 1);
在此之后,我为onerror
对象定义onupgradeneeded
,onsuccess
和App.db
。
在onupgradeneeded
中,我创建了一个新的对象库。
最后,Javascript自动调用onsuccess
方法,因为创建/加载了数据库。在此方法中,我列出了App.db
。
App.db.onsuccess = function(ev){
console.dir( App.db );
};
控制台显示,
readyState = "done"
result = IDBDatabase
transaction = null
我分别使用file:///,http://localhost,http://myownserver.that.is.forwarded.to.127.0.0.1.from.domain.provider调用了该页面。
但问题仍然存在。 transaction
方法为空,我无法执行任何操作,启动任何事务。有什么问题,我错过了什么?
答案 0 :(得分:2)
indexedDB.open
返回请求对象(IDBRequest
)。因此,App.db
将保留请求。
听起来你已经掌握了升级过程。
一旦完成,就会通过请求的IDBDatabase
属性返回连接对象(result
实例),并使用连接对象上的transaction()
方法启动事务。因此,您希望更好地编写"success"
处理程序:
App.db.onsuccess = function(ev){
var connection = App.db.result;
var tx = connection.transaction(stores, mode);
...
};
但是更常见的是调用连接对象类似于db
,并且一旦打开连接就不需要保留请求,所以你可能想做的更像是这样的:
var openRequest = indexedDB.open("myapp", 1);
openRequest.onupgradeneeded = function(e) {
var db = openRequest.result;
db.createObjectStore(...);
...
};
openRequest.onsuccess = function(e) {
App.db = openRequest.result;
var tx = App.db.transaction(...);
};