- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为基本设置的示例,创建了一个索引。
db.onupgradeneeded = function(event) {
var db = event.target.result;
var store = db.createObjectStore('name', { keyPath: 'id' });
store.createIndex('by name', 'name', { unique: false });
};
问题:是否可以在 future
versionupdate
上向同一个 objectStore
创建/附加更多索引?
因为如果我尝试:
db.onupgradeneeded = function(event) {
var db = event.target.result;
var store = db.createObjectStore('name', { keyPath: 'id' });
store.createIndex('by newName', 'newName', { unique: false });
};
它抛出一个错误,当前 objectStore 已经存在
。如果我尝试使用事务创建商店引用:
db.onupgradeneeded = function(event) {
var db = event.target.result;
var store = db.transaction('name', 'readwrite').objectStore('name');
store.createIndex('by newName', 'newName', { unique: false });
};
它抛出版本更改事务当前正在运行
最佳答案
是的,这是可能的。一开始可能会有点困惑。您希望通过在 onupgradeneeded 中为您创建的隐式事务来获取现有的对象存储。这是一个 versionchange 类型的事务,基本上类似于一个读写事务,但特定于 onupgradeneeded 处理函数。
类似这样的事情:
var request = indexedDB.open(name, oldVersionPlusOne);
request.onupgradeneeded = myOnUpgradeNeeded;
function myOnUpgradeNeeded(event) {
// Get a reference to the request related to this event
// @type IDBOpenRequest (a specialized type of IDBRequest)
var request = event.target;
// Get a reference to the IDBDatabase object for this request
// @type IDBDatabase
var db = request.result;
// Get a reference to the implicit transaction for this request
// @type IDBTransaction
var txn = request.transaction;
// Now, get a reference to the existing object store
// @type IDBObjectStore
var store = txn.objectStore('myStore');
// Now, optionally inspect index names, or create a new index
console.log('existing index names in store', store.indexNames);
// Add a new index to the existing object store
store.createIndex(...);
}
您还需要注意增加版本,以保证调用 onupgradeneeded 处理函数,并表示您的架构(基本上是表、索引和事物的属性集)在新版本中已更改.
您还需要重写该函数,以便仅根据版本创建或进行更改。您可以使用 event.oldVersion
来帮助解决此问题,或者使用 db.objectStoreNames.contains
之类的东西。
类似这样的事情:
function myOnUpgradeNeeded(event) {
var is_new_db = isNaN(event.oldVersion) || event.oldVersion === 0;
if(is_new_db) {
var db = event.target.result;
var store = db.createObjectStore(...);
store.createIndex('my-initial-index');
// Now that you decided you want a second index, you also need
// to do this for brand new databases
store.createIndex('my-second-new-index');
}
// But if the database already exists, we are not creating things,
// instead we are modifying the existing things to get into the
// new state of things we want
var is_old_db_not_yet_current_version = !isNaN(event.oldVersion) && event.oldVersion < 2;
if(is_old_db_not_yet_current_version) {
var txn = event.target.transaction;
var store = txn.objectStore('store');
store.createIndex('my-second-new-index');
}
}
请密切注意我使用了 event.target.transaction
而不是 db.transaction(...)
。这些根本不是同一件事。一个引用现有事务,一个创建一个新事务。
最后,此外,这是我的个人规则,而不是正式的编码要求,您永远不应该在 onupgradeneeded 中使用 db.transaction()
。升级时坚持修改架构,并在架构之外进行所有数据更改。
关于javascript - 在已有的 objectStore 上创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50193906/
我一直在尝试使用Dart的IndexedDb包从IndexedDb实例中获得一个条目。但是我将getObject()称为文档说的返回Future *(我不知道的 future ),我没有任何Maps或
作为基本设置的示例,创建了一个索引。 db.onupgradeneeded = function(event) { var db = event.target.result; var st
我有一个选择框,我想用 objectStore 中的值自动填充它,因为我需要像这样迭代它:“从表中选择 COL1,其中 COL2 = 'myvalue'”,这是我的代码: var db; var re
我基本上有这段代码来生成一个带有一个 objectStore 的新数据库: DB.open_or_create({table: 'photos', key: 'url'}); 主要代码: var DB
在 this example ,作者使用以下行: var customerObjectStore = db.transaction("customers", "readwrite").object
有人可以告诉我下面的代码怎么了。主要问题是该行: fDbListAllClients; // this is not being "called" 似乎没有执行。 也可能有其他错误代码。我不担心
我想迭代 IndexedDB objectStore,获取结果并填充此选择框。 这是我的 HTML 这是我的 JavaScript function pop
我试图了解 indexedDB 的工作原理并编写了一个相当基本的站点访问者跟踪器。这是第一次工作。第一次加载页面时,一切都按预期进行。我可以看到数据已添加到我的 objectStore 中。 现在每次
我正在尝试连接到 Bluemix 中的对象存储服务。但是,我不断遇到异常(exception)。这是我的代码: public static void main(String[] args){
我有一个包裹在 dojo.data.ObjectStore 中的 dojo.store.Memory,然后我将其插入到 dataGrid 中。我想从商店中删除一个项目并更新网格。我已经尝试了所有我能想
谁能告诉我如何将新的对象库添加到现有的 indexeddb 实例中,该实例中有一个版本号。当我尝试创建新版本时,现有对象存储被删除。 我有一个版本“1”,它有大约 10 个包含数据的对象存储。当我尝试
对于我的 IndexedDB,我正在拉取各种 Ajax 请求,这些请求将向 objectStore 提供数据。由于事务是异步的,我应该如何链接 objectStores 的创建?我想这样做: 1- 在
第一次使用索引查询时间过长。 使用场景:移动端使用webview。 数据保存到indexedDb后,第一次打开页面查询速度极慢。 查询代码: var startTime = new Date().ge
我使用的是1.7.2当我将项目添加到对象存储时,我写 dataStore.newItem(data); 然后我尝试保存dataStore.save(),然后dijit.byId(gridId)._re
试图学习 IndexedDB 的概念和 API,我正在努力弄清楚如何使用 IDBObjectStore.add 方法为 objectStore 指定键。根据规范,第一个参数是值,第二个可选参数是键。当
所以我看到RestKit的引用中有一个init方法:objectStoreWithStoreFilename:inDirectory:usingSeedDatabaseName:managedObje
我只看到一个在模式更新时触发的事件,IndexedDB 中是否有任何数据更改的通知机制? 最佳答案 没有。至少,它不是规范的一部分。参见 http://lists.w3.org/Archives/Pu
我想知道什么时候拥有一个数据库与一个数据库具有多个对象存储是个好主意。我已经阅读了 Web 上的大多数教程并查看了 indexedDB 的规范,但找不到比较这些不同概念的好例子。有没有人有此类事情的具
我正在努力更新 indexedDB 中 objectStore 中的一系列四个条目。 这就是我想要实现的(伪代码): let myDatabase = indexedDB('myDatabase',
如何在使用 objectstore.put() 将记录插入 IndexedDB 后返回自动递增的 ID? 下面是我的代码: idb.indexedDB.addData = function (obje
我是一名优秀的程序员,十分优秀!