您需要在单独的事务中创建对象存储,您将打开数据库和创建对象存储事务集中到同一个事件中。
此外,您的对象存储不能同时拥有autoincrement
和path
as 选项。你必须选择一个或另一个。
这是将使您的示例运行的代码:
function initDB() {
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
db = event.target.result;
createObjectStore();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('blah blah<br/>');
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
}
function createObjectStore() {
db.close();
var request = window.indexedDB.open('demo', 2);
request.onsuccess = function(event) {
db = event.target.result;
showDB();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('yeah yeah yeah<br/>');
var store = db.createObjectStore('StoreName', { keyPath: 'id' });
store.createIndex('IndexName', 'id', { unique: true });
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
如果您开始遇到困难,可以查看我为 Firefox 插件 SDK 编写的一些 indexeddb 代码。代码比您需要的更复杂,但您将能够看到所有需要发生的事件、错误和事务顺序。https://github.com/clarkbw/indexed-db-storage
祝你好运!