我遇到了索引数据库的问题。在Firefox 18上,当我创建新数据库时,onsuccess
方法被调用的同时有onupgradeneeded
。在Chrome 24(这是我想要得到的行为),该onsuccess
方法仅称为onupgradeneeded
方法完成之后。为什么在连接到indexedDB时onsuccess需要onsuccess有时会被调用?
根据IndexedDB上的MDN信息,我的印象是,当onsuccess方法被调用时,使用数据库是安全的,但这使得它看起来像不在Firefox中。
(function(){
app = {};
// These will hold the data for each store.
app.objectstores = [
{ name: 'UNIVERSITIES',
keyPath: 'UID',
autoIncrement: false,
data_source: 'http://mysites.dev/nddery.ca_www/larelance/data/universite.json' },
];
// Some information pertaining to the DB.
app.indexedDB = {};
app.indexedDB.db = null
app.DB_NAME = 'testdb';
app.DB_VERSION = 1;
/**
* Attempt to open the database.
* If the version has changed, deleted known object stores and re-create them.
* We'll add the data later.
*
*/
app.indexedDB.open = function() {
// Everything is done through requests and transactions.
var request = window.indexedDB.open(app.DB_NAME, app.DB_VERSION);
// We can only create Object stores in a onupgradeneeded transaction.
request.onupgradeneeded = function(e) {
app.indexedDB.db = e.target.result;
var db = app.indexedDB.db;
// Delete all object stores not to create confusion and re-create them.
app.objectstores.forEach(function(o) {
if (db.objectStoreNames.contains(o.name))
db.deleteObjectStore(o.name);
var store = db.createObjectStore(
o.name,
{ keyPath: o.keyPath, autoIncrement: o.autoIncrement }
);
app.indexedDB.addDataFromUrl(o.name, o.data_source);
});
}; // end request.onupgradeneeded()
// This method is called before the "onupgradeneeded" has finished..??
request.onsuccess = function(e) {
app.indexedDB.db = e.target.result;
app.ui.updateStatusBar('Database initialized...');
// ***
// Would like to query the database here but in Firefox the data has not
// always been added at this point... Works in Chrome.
//
}; // end request.onsuccess()
request.onerror = app.indexedDB.onerror;
}; // end app.indexedDB.open()
app.indexedDB.addDataFromUrl = function(store, url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function(event) {
if(xhr.status == 200) {
console.log('*** XHR successful');
// I would be adding the JSON data to the database object stores here.
}
else{
console.error("addDataFromUrl error:", xhr.responseText, xhr.status);
}
};
xhr.send();
}; // end app.indexedDB.addDataFromUrl()
})();
谢谢!
的交易Chrome和Firefox中是较高的是有意义的超时。我将尝试使同步AJAX(这是一种反生产)请求,并查看事务是否保持打开状态。预取我的数据,而不是通过AJAX调用将它添加到数据库中解决这个问题?任何其他选项? – nddery 2013-02-17 23:41:49
也许有其他观点。想想这个。保持现在的情况。在onupgradeneeded事件中,您触发ajax调用,并让version_change事务提交。当您收到AJAX调用的回调函数时,您将创建一个到db的新连接,以便插入检索到的数据。当然,这是一个非常简单的表达方式,但如何做到这一点。 – 2013-02-18 09:39:50