我不明白如何使用Dexie从IndexedDB中获取值.数据库在inspect tool的"应用程序"选项卡中都很好.完全是新手,所以请理解.

我的数据库.js

import Dexie from "dexie";

export const db = new Dexie("myDatabase");
db.version(2).stores({
  history: "++id, daterange, days",
  storage: "id, name, value"
});

db.on("populate", function () {
  db.storage.add({
    id: 0,
    name: "total",
    value: 20
  });
  db.storage.add({
    id: 1,
    name: "left",
    value: 20
  });
});
db.open();

应用程序.快速的

<script>
  import Counter from "./src/Counter.svelte";
  import New from "./src/New.svelte";
  import History from "./src/History.svelte";
  import { liveQuery } from "dexie";
  import { db } from "./src/db";

  let total = liveQuery(() =>
    db.storage
      .where("name")
      .equals("total")
      .value.then(function(a) {
        totals = a;
      })
  );

  let left = 25;
</script>

<style>
  main {
    width: 100%;
  }
</style>

<main>
    <Counter daysLeft={left} daysMax={total}/>
    <New />
    <History />
</main>

无论我try 什么,对象都有daysMax={total}个输出undefined[object Object]或类似[Dexie object Object]的东西.我只想从db得到20,如db所示.js:

db.on("populate", function () {
  db.storage.add({
    id: 0,
    name: "total",
    value: 20
  });

(这一切都有效,在indexedDb中可见)

CodeSandbox

推荐答案

正如您所说,您的数据库设置和初始写入操作都已正确完成.问题在于您的查询:

  let total = liveQuery(() =>
    db.storage
      .where("name")
      .equals("total")
      .value.then(function(a) {
        totals = a;
      })
  );

首先,查询的WhereClause部分(db.storage.where("name").equals("total"))返回Collection,引用文档:

表示数据库对象的集合.请注意,它本身不包含任何对象.相反,它为如何执行DB查询做了准备.调用返回promise 的方法时将执行查询,例如toArray()、keys()、count()或each().

因此,不能像在代码中那样简单地取消对.value的引用.您必须改用Collection提供的方法之一.因为在您的用例中,您只希望在数据库中找到一个匹配项,所以我建议这里使用Collection.first(),它将返回一个promise ,最终解析为您正在查询的数据.

因此,您的查询应该如下所示:

  let total = liveQuery(() =>
    db.storage
      .where("name")
      .equals("total")
      .first()
  );

接下来是使用liveQuery的方式.liveQuery()所做的是将一个promise (你现在将从上一步中得到)变成一个可观察的promise .如文件所述:

Svelte Store Contract是Ecmascript Observable规范草案的一个子集,它使liveQuery()的返回值本身成为完全有效的Svelte Store.

这里的意思是total实际上会像Svelte (readable) store一样,可以订阅或使用速记$语法访问.这意味着,一旦查询完成并且promise解析,$total将保留与您的查询匹配的数据库对象.

而且因为它是一个可观察的(因此是一个苗条的存储),所以对数据库记录所做的任何更新都会立即反映为$total.

最后要做的事情是访问数据库对象的value属性.因为在查询运行和promise 解析时,$total最初将是undefined,所以我还将添加一个条件:

<main>
    {#if $total}
        <Counter daysLeft={left} daysMax={$total.value}/>
    {/if}
    <New />
    <History />
</main>

Forked, working CodeSandbox

Javascript相关问答推荐

为什么子组件没有在reaction中渲染?

为什么我的第二个OnClick Isloading值在TEK查询Mutations 查询中不起作用?

仅在React和JS中生成深色

如何使用Echart 5.5.0创建箱形图

硬币兑换运行超时

格式值未保存在redux持久切片中

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

在网页上添加谷歌亵渎词

将现场录音发送到后端

从Node JS将对象数组中的数据插入Postgres表

如何在模块层面提供服务?

在浏览器中触发插入事件时检索编码值的能力

在我的index.html页面上找不到我的Java脚本条形图

使用Nuxt Apollo在Piniastore 中获取产品细节

如何在.NET Core中将chtml文件链接到Java脚本文件?

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

邮箱密码重置链接不适用于已部署的React应用程序

钛中的onClick事件需要在两次点击之间等待几秒钟

为什么在函数中添加粒子的速率大于删除粒子的速率?

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?