导出和导入 IndexedDB 数据

Posted

技术标签:

【中文标题】导出和导入 IndexedDB 数据【英文标题】:Exporting and importing IndexedDB data 【发布时间】:2011-12-09 12:45:08 【问题描述】:

我正在制作一个我自己使用的工具,它需要一个简单的数据库。这似乎是学习 html5 IndexedDB API 的好机会,但重要的是我不会在任何时候丢失数据。

我想备份浏览器的配置文件目录可以作为备份,但我还希望可能与不同的计算机一起工作,因此导出和导入数据库会很好。有没有一种简单的方法来库?浏览器特定的解决方案是可以的。

【问题讨论】:

我有点惊讶在网络检查器中没有类似的选项。 Chrome 的检查器可让您查看数据库,但您似乎无法与它进行太多交互。 @StevendeSalas 还没有——我想它可能已经足够新了,这样的工具还不存在。 【参考方案1】:

pure IndexedDB spec 中没有类似的功能,但是,您可以编写自己的方法来完成此操作。

导入数据的基本步骤是

    打开 IndexedDB 数据库 创建对象存储 添加索引 遍历您的对象并一一添加(通过addput 操作)

要导出对象存储,您可以:

    在每个刻度处打开一个左边界为零的光标 向请求对象添加onsuccess回调以捕获行值 在每次成功回调时将行推送到特权数组var

最后一行将发出null,这是一种您可以观察的状态,以确定游标何时用尽其所有记录并完成。发生这种情况时,您可以调用导出回调,传递代表对象存储备份的特权对象数组。

【讨论】:

根据经验,我可以说编辑的回应是唯一的方法。另请注意,您必须非常聪明地处理它所需的所有异步编程。我建议有一个缓存对象,所有数据都会被转储。 我已经编写了一个模块indexeddb-export-import 来执行此操作,基本上如本答案中所述。【参考方案2】:

您可以在 WebSQL 中在解决方案 posted here 之上编写一些 javascript,但是您将错过学习 IndexDB 的机会。

如果你真的想从内到外学习 IndexDB,也许你可以自己编写导入/导出工具,我认为将来会有足够的需求。

【讨论】:

【参考方案3】:

尝试使用jStorage,它支持大多数浏览器,除了没有localStorage的浏览器(如已弃用的Safari3)

它有很多功能,但我们可以尝试用这些实现你想要的:

设置(键,值)

$.jStorage.set(key, value)

将值保存到本地存储。 key 必须是字符串,否则会引发异常。 value 可以是任何 JSONeable 值,包括对象和数组或 XML 节点。 目前 XML 节点不能嵌套在其他对象中:$.jStorage.set("xml", xml_node) 可以,但 $.jStorage.set("xml", xml: xml_node) 不行。


get(key[, default])

value = $.jStorage.get(key)
value = $.jStorage.get(key, "default value")

如果键存在则获取值,如果不存在则获取默认值。 key 必须是字符串,否则会引发异常。默认值可以是任何值。


flush()

$.jStorage.flush()

清除缓存。


索引()

$.jStorage.index()

以数组形式返回当前使用的所有键。

var index = $.jStorage.index();
console.log(index); // ["key1","key2","key3"]

考虑到这一点,考虑到您已经设置了一个数据库,您可以使用 var index = $.jStorage.index(); 并使用数组创建一个 jQuery .each() 循环来获取数组的每个键并调用 get() @ 987654328@ 并添加到一个大字符串中,最终可以解析为 .csv,甚至是 XML 或 json(您选择)。

有了这些数据,你可以$.jStorage.flush()清除。

然后,如果你想为一个新的数据库导入数据,你需要做的就是一个 .each() 读取你保存的字符串/文件并开始使用$.jStorage.set(key, value) 设置 kay/value par .

如果您还没有数据库,只需使用$.jStorage.set(key, value) 填充一个新数据库。 :)

【讨论】:

这本身并没有回答问题,而是为潜在问题提供了解决方案,所以+1。 今天(答案发布后 2 年)添加 -1 的人会很高兴说出为什么投票失败。 1 年后让我回答你的问题,这可能与我考虑投反对票的原因相同:它没有回答 Juhana 已经提到的问题 @DavidMulder 这个问题没有代码可以处理。从“有没有简单的方法来导出和导入 IndexedDB 数据库?”的要点,我举了一个例子,就像 Juhana 在第一条评论,提供问题的解决方案。没有提供可复制代码。我通常不会像急需代表的人那样突然给出代码。展望今天,我想说这个问题需要用 OP 尝试过的任何代码重写,以便我们可以使用甚至标记为过于广泛。如您所见,即使是其他答案也没有给 OP 准备好复制代码,因此没有人获奖.. 我不是在谈论准备复制代码,我只是在谈论这样一个事实,即提供另一种访问数据库的方式(jStorage)对于帮助解决导出和导入自身(在 indexedDB 本身中循环项目、获取项目、刷新项目等都是可能的......)。不管怎样,最终构建我自己的通用工具(本机 indexedDB),我可能会在未来几天的某个时候在 github 上发布。

以上是关于导出和导入 IndexedDB 数据的主要内容,如果未能解决你的问题,请参考以下文章

indexed database IndexedDB

elasticdump实现es数据导入导出

EasyExcel导入、导出Excel

数据泵导出导入

使用indexedDB(翻译)

./src/index.js 尝试导入错误:“./App.js”不包含默认导出(导入为“App”)