You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端SQLDelight FTS5 MATCH查询无返回结果问题

SQLite FTS5在SQLDelight Android端查询无结果排查方案

以下是按出现概率从高到低排序的问题原因与修复方法:

  • 多语句执行不完整,触发器未实际创建
    这是概率最高的问题。SQL Delight 2.0.0-alpha03版本的Android平台SqlDriver默认不支持在单个execute调用中执行多条分号分隔的SQL,你把建FTS表、三个触发器的SQL拼为一个字符串传入时,只有第一条建虚拟表的语句会执行,后续三个触发器完全没创建。此时你往note表插入数据时,不会触发索引同步逻辑,FTS表是空的,MATCH查询自然无结果。
    验证方法:
    1. 执行SELECT * FROM NoteFts直接查FTS表内容,如果返回空,说明索引根本没有写入;
    2. 执行SELECT name FROM sqlite_master WHERE type='trigger',确认note_ai、note_ad、note_au三个触发器是否存在。
      修复方法:将建FTS表、三个触发器的SQL拆分为4次独立的execute调用,每条SQL单独执行。
  • 全量同步索引时未绑定正确rowid
    你手动做全量索引用的SQL是INSERT INTO NoteFts(title, description) SELECT title, description FROM note;,没有显式指定rowid字段。由于你建FTS表时配置了content_rowid='noteid',这种写法会让FTS表自动生成自增rowid,和原表的noteid值完全不对应,即使索引生成了,外层关联note表的noteid字段时也匹配不到任何数据。
    修复方法:全量同步时显式传入rowid映射,改为:
    INSERT INTO NoteFts(rowid, title, description) SELECT noteid, title, description FROM note;
    
  • 表名配置不匹配
    你提到SQLDelight通过.sq文件创建的内容表名为notes(带s后缀),但FTS表配置中写的是content='note'(不带s),外部内容模式的FTS5表依赖content参数指定的原表名做关联,表名错误会直接导致索引同步、查询逻辑全部失效。
    验证方法:执行SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'note%'确认原表的实际表名,保证FTS配置的content参数和原表名完全一致(注意SQLite对加双引号的表名是大小写敏感匹配的)。
  • FTS5扩展兼容问题
    Android 8.0以下的系统自带SQLite默认没有编译FTS5扩展,部分厂商定制ROM即使是高版本也可能裁剪FTS5支持。这类环境下创建FTS5虚拟表可能不会报错,但实际MATCH查询逻辑无法正常执行。
    验证方法:执行SELECT sqlite_compileoption_used('ENABLE_FTS5');,如果返回0说明当前环境不支持FTS5。
    修复方法:不要依赖系统自带SQLite,替换为捆绑了独立SQLite二进制的SQLDelight驱动,保证FTS5扩展可用。
  • 查询参数绑定错误
    如果你在代码中通过绑定参数传入MATCH的搜索关键词,不要手动给参数包裹单引号。SQLDelight会自动处理参数转义,如果你传入的字符串自带额外单引号(比如传入值为"'note1'"),实际匹配的是带单引号的内容,自然返回空结果。
  • FTS索引损坏
    如果以上排查都没问题,可以尝试重建FTS索引后重试,执行SQL:
    INSERT INTO NoteFts(NoteFts) VALUES('rebuild');
    

内容的提问来源于stack exchange,提问作者Borislav Nikolov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:15:58