当前位置: 首页 > 知识库问答 >
问题:

前端 - 有索引,为何查询不了数据呢?

牧甫
2025-03-16

indexedDB的一条数据如下:

{isSelected: false, projName: '222', desc: '222', path: '/Users/jphn/electron-code/src', create_time: '2025-03-15T03:03:06.805Z', …}

image.png

定义时候:是有给isSelected的索引的:

db.version(1).stores({
  settings: '++id',
  projs: '++id,name,desc,path,isSelected'
})

我查询的时候:

const selectedProj = await db.projs.where('isSelected').equals(true).first();

报错:

projApi.dexie.ts:42 Unable to get selected project: 
DexieError2 {name: 'DataError', message: "Failed to execute 'bound' on 'IDBKeyRange': The pa… 'IDBKeyRange': The parameter is not a valid key.", inner: DataError: Failed to execute 'bound' on 'IDBKeyRange': The parameter is not a valid key.
    at mak…}

共有2个答案

孔弘盛
2025-03-16
  1. 某些版本的浏览器在IndexedDB中不支持布尔值作为键

将布尔值转换为数字或字符串:

// 在存储数据时
const projData = {
  projName: '222',
  desc: '222',
  path: '/Users/jphn/electron-code/src',
  isSelected: 1,  // 使用0和1代替false和true
  create_time: '2025-03-15T03:03:06.805Z'
};

// 或者作为字符串
const projData = {
  // ...其他字段
  isSelected: 'true',  // 使用'false'和'true'字符串
};

// 在查询时
const selectedProj = await db.projs.where('isSelected').equals(1).first();
// 或
const selectedProj = await db.projs.where('isSelected').equals('true').first();

将布尔值以数字形式存储(0表示false,1表示true),这是最简单且兼容性最好的方式。

阮鸿煊
2025-03-16

出现此问题的根本原因是:IndexedDB 的索引键不允许使用 boolean 类型值。在 IndexedDB 规范中,合法的键类型包括:string、number、Date、Array(由这些类型组成),但不包含 boolean 类型。

具体解决方法:

  1. 修改数据库 Schema

    // 将索引字段转换为数值类型 (0/1)
    db.version(1).stores({
      settings: '++id',
      projs: '++id,name,desc,path,isSelected'
    });
  2. 存储数据时转换类型

    // 存入时转换 boolean 为 number (true → 1, false → 0)
    await db.projs.add({
      ...yourData,
      isSelected: 1 // 或 0
    });
  3. 修改查询方式

    // 查询时使用 1 替代 true
    const selectedProj = await db.projs.where('isSelected').equals(1).first();

额外注意事项:

  • 需要将现有数据中的 isSelected 字段批量转换为数值类型 (0/1)
  • 如果之前已有旧版本数据库,需通过 db.delete() 删除旧库或增加版本号触发升级
  • 使用 Dexie 的 mapToClass 可以在模型层自动处理类型转换

错误原理说明:
当试图用 true 作为索引键值查询时,IndexedDB 底层会检测到键类型不合法 (boolean 不是有效的键类型),从而抛出 DataError。该错误会沿着 Dexie 的 Promise 链向上传播,最终被你的 try/catch 捕获。

 类似资料:
  • 问题内容: 如何在Elasticsearch中按数组索引查询/过滤? 我有一个像这样的文件: 我想搜索 LIN [0] 是否为“ UP”并且 LIN [1]是否 存在。 谢谢。 问题答案: 这看起来可能像hack,但是可以肯定地起作用。首先,我们将令牌计数类型与多字段一起应用以捕获令牌数量作为字段。因此,映射将如下所示- 链接-http: //www.elasticsearch.org/guide

  • 问题内容: 我有一个查询,在我认为可能不使用索引的情况下,出于好奇,我将其重现: 创建一个具有1.000.000行(在中有10个不同的值,在中有500个字节的数据)的。 创建一个索引并收集表统计信息: 尝试获取和的不同值: 不使用索引,前提是提示不会更改。 我想在这种情况下不能使用索引,但是为什么呢? 问题答案: 我运行了Peter的原始内容并复制了他的结果。然后我应用了dcp的建议… 之所以如此

  • 所以除了上面的5个字段之外,core0中的rest all字段将为null。 下一个是核心1 核心1我们使用单独的查询索引3个字段 谢谢,拉维

  • 我在MySQL中有一个表,它有一个主键列。 有什么建议吗??也许是一个询问..:)

  • 问题内容: 我在ElasticSearch和Rails时遇到问题,由于attr_protected,其中一些数据未正确索引。Elastic Search在哪里存储索引数据?检查实际的索引数据是否错误将很有用。 检查映射对您没有帮助,将列出该字段。 问题答案: 探索您的ElasticSearch集群的最简单方法可能是使用elasticsearch -head。 您可以通过以下方式安装它: 然后(假设

  • 问题内容: 我对即将要做的索引编制感到有些困惑。 首先,我使用4列索引,如下所示: 索引名称-advanced_query 索引中将使用列-标题,类别1,类别2,类别3 索引代码 好的,这就是它的工作方式(据我了解): 标题 查询将使用索引。 cat_1 查询将使用索引。 cat_2 查询将使用索引。 cat_3 的查询将 不 使用索引。因此,我将为其创建一个不同的索引。 查询 标题cat_1 将

  • 我有两个实体AAA和BBB,如下所示 以及BBB实体作为 现在使用spring数据JPA本机查询,我需要一个如下的查询(使用JPARepository) 当执行时,它会给出以下异常 这里的bbb详细信息是键(BBBType)值(子实体)对的映射。如何根据数据jpa本机查询中的BBBType值查询映射的子实体?