导出和导入 IndexedDB 数据
Posted
技术标签:
【中文标题】导出和导入 IndexedDB 数据【英文标题】:Exporting and importing IndexedDB data 【发布时间】:2011-12-09 12:45:08 【问题描述】:我正在制作一个我自己使用的工具,它需要一个简单的数据库。这似乎是学习 html5 IndexedDB API 的好机会,但重要的是我不会在任何时候丢失数据。
我想备份浏览器的配置文件目录可以作为备份,但我还希望可能与不同的计算机一起工作,因此导出和导入数据库会很好。有没有一种简单的方法来库?浏览器特定的解决方案是可以的。
【问题讨论】:
我有点惊讶在网络检查器中没有类似的选项。 Chrome 的检查器可让您查看数据库,但您似乎无法与它进行太多交互。 @StevendeSalas 还没有——我想它可能已经足够新了,这样的工具还不存在。 【参考方案1】:pure IndexedDB spec 中没有类似的功能,但是,您可以编写自己的方法来完成此操作。
导入数据的基本步骤是
-
打开 IndexedDB 数据库
创建对象存储
添加索引
遍历您的对象并一一添加(通过
add
或put
操作)
要导出对象存储,您可以:
-
在每个刻度处打开一个左边界为零的光标
向请求对象添加
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 数据的主要内容,如果未能解决你的问题,请参考以下文章