【问题标题】:IndexedDB overwrites values during upgradeIndexedDB 在升级期间覆盖值
【发布时间】:2012-08-18 12:45:04
【问题描述】:

我创建了一组 JSON 数据,这些数据在升级事件期间传递到 IndexedDB。它创建了一个看起来没有问题的非常好的 IndexedDB 数据库。问题是当您将数据库从版本 1 升级到 2 时,它会覆盖所有现有数据,因为它只是遍历 JSON 并应用它。

在升级过程中必须采取某种方法来防止没有唯一键的新数据库项写入任何内容。我该怎么做?因为下面只是覆盖当前数据。

objectStore = event.currentTarget.transaction.objectStore('player');
objectStore.put({ key: 'non unique, but I replace my twin\'s data anyway', data: value });

提前感谢您的帮助,搜索了所有内容,但找不到解决此问题的方法。

编辑 2012 年 8 月 24 日

根据 Kristof 使用 get 检查信息的建议,我做了一些挖掘和研究。找到答案后,我决定编写一些伪代码来帮助您。

// Create the get request inside your upgrade
var tableData = event.currentTarget.transaction.objectStore('your table name');
var getData = tableStore.get('your key');

// Run the get request
getData.onsuccess = function (e) {
    var result = e.target.result;

    // Immediately exit if the current result is not undefined
    if (result !== undefined) {
        return;
    }

    // Note, you may or may not need a closure to write data in the callback
    // See here for more info on closures in events http://stackoverflow.com/questions/3495679/passing-parameters-in-javascript-onclick-event#answer-3495722
    tableStore.add('data to add');
};

【问题讨论】:

    标签: javascript database html indexeddb


    【解决方案1】:

    只有在找到数据库中已经存在的键时才会覆盖数据。如果它没有找到密钥,它将被添加。

    如果您想防止此数据被第二次插入或更新,有一些解决方案:

    • 在放入数据之前,检查是否存在与该键相关的任何内容(get 方法)
    • 使用 add 方法而不是 put。 (当密钥已经存在时,这将导致错误。不是很好)
    • 检查旧版本的数据库是 0 还是什么都没有,然后才运行插入。

    【讨论】:

    • 尝试了除get之外的所有选项。所以我应该做 get.success = 'don't write this'; get.error = '写这个';我猜如果它已经不存在会引发一个令人讨厌的错误,但不是吗?
    • 请执行以下操作 get.success = function(e){ if(!get.result){ //insert }}。这应该有效。我宁愿做我的最后一个选择。数据库的版本也可能是“”...
    • 如果我检查数据库和它的0或什么都没有,我只能升级它一次。我需要它可以升级到可能的多个版本。打算在本周末使用 get 看看他们的键是否存在。
    • 在这种情况下,您需要在更高版本或 chrome 中使用 setversion 方法打开数据库
    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 2021-07-21
    • 1970-01-01
    • 2014-04-05
    • 2022-06-19
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多