导出和导入IndexedDB数据

JJJ*_*JJJ 14 javascript html5 indexeddb

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

我想备份浏览器的配置文件目录可以进行备份,但我也希望可以使用不同的计算机,因此导出和导入数据库会很好.有没有一种简单的方法来导出和导入IndexedDB数据库?浏览器特定的解决方案是好的.

bul*_*ley 6

纯粹的IndexedDB规范中没有这样的东西,但是,可以编写自己的方法来实现这一点.

导入数据的基本步骤是

  1. 打开一个IndexedDB数据库
  2. 创建一个对象库
  3. 添加索引
  4. 循环遍历您的对象并逐个添加它们(通过addput操作)

要导出对象库,您可以:

  1. 打开一个零,作为左边界和每个刻度线的光标
  2. onsuccess向请求对象添加回调以捕获行值
  3. 在每个成功回调上将行推送到特权数组var.

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

  • 根据经验,我可以说编辑的回应是唯一的方法.另外要注意,你必须非常聪明地使用它所需的所有异步编程.我建议有一个缓存对象,其中所有数据都被转储. (3认同)
  • 我写了一个模块[indexeddb-export-import](https://github.com/Polarisation/indexeddb-export-import),它完成了这个,基本上如本答案所述. (2认同)

Rap*_*DDL 0

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

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

设置(键,值)

$.jStorage.set(key, value)
Run Code Online (Sandbox Code Playgroud)

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


获取(键[,默认])

value = $.jStorage.get(key)
value = $.jStorage.get(key, "default value")
Run Code Online (Sandbox Code Playgroud)

如果键存在,则 get 检索值;如果不存在,则检索默认值。key 必须是字符串,否则会抛出异常。默认值可以是任何值。


冲洗()

$.jStorage.flush()
Run Code Online (Sandbox Code Playgroud)

清除缓存。


指数()

$.jStorage.index()
Run Code Online (Sandbox Code Playgroud)

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

var index = $.jStorage.index();
console.log(index); // ["key1","key2","key3"]
Run Code Online (Sandbox Code Playgroud)

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

有了这些数据在手,你就可以$.jStorage.flush()一清二楚了。

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

如果您还没有数据库,只需使用$.jStorage.set(key, value). :)

  • 这本身并没有回答问题,而是提供了根本问题的解决方案,所以+1。 (3认同)
  • 一年后让我回答你的问题,这可能和我考虑投反对票的原因相同:它没有回答 Juhana 已经提到的问题 (3认同)
  • 我不是在谈论准备复制的代码,我只是在谈论这样一个事实:提供另一种访问数据库的方式(jStorage)对于帮助解决导出和导入本身的问题(循环项目)没有任何帮助,获取项目,刷新项目等都可以在indexedDB本身中进行...)。不管怎样,最终为这项工作构建我自己的通用工具(本机indexedDB),我可能会在接下来的几天内将其发布在 github 上。 (3认同)