在SQLite

时间:2016-02-26 06:14:24

标签: sqlite full-text-search fts5

我尝试为常规表创建触发器,然后在SQLite中更新全文索引,但我收到了一些错误,而且我不知道我在哪里走了错误。

我正在制作的应用是一个书签应用,我保存书签数据的数据库是使用以下SQL语句创建的:

create table "pages" (
  "pageUrl" text not null unique on conflict replace, 
  "dateCreated" integer not null, 
  "pageDomain" text not null, 
  "pageTitle" text null, 
  "pageText" text null, 
  "pageDescription" text null, 
  "archiveLink" text null, 
  "safeBrowsing" text null, 
  primary key ("pageUrl")
);

然后使用以下命令创建全文搜索索引:

create virtual table fts using fts5(
  content='pages', 
  content_rowid='pageUrl', 
  pageDomain, 
  pageTitle, 
  pageText, 
  pageDescription
);

那么我想在"页面"时更新fts索引。表通过插入或删除来更新。

我插入的触发器:

create trigger afterPagesInsert after insert on pages begin
  insert into fts(
    rowid, 
    pageDomain, 
    pageTitle, 
    pageText, 
    pageDescription
  )
  values(
    new.pageUrl, 
    new.pageDomain, 
    new.pageTitle, 
    new.pageText, 
    new.pageDescription
  );
end;

我有删除的触发器:

create trigger afterPagesDelete after delete on pages begin
  insert into fts(
    fts,
    rowid,
    pageDomain,
    pageTitle,
    pageText,
    pageDescription
  )
  values(
    'delete',
    old.pageUrl,
    old.pageDomain,
    old.pageTitle,
    old.pageText,
    old.pageDescription
  );
end;

这是我使用的一个sql insert语句的示例:

insert into "pages" (
  "pageUrl",
  "dateCreated",
  "pageDomain",
  "pageTitle",
  "pageText",
  "pageDescription",
  "archiveLink",
  "safeBrowsing"
  )
values(
  'https://www.reddit.com/',
  1456465040177,
  'reddit.com',
  'reddit: the front page of the internet',
  'reddit: the front page of the internet',
  'reddit: the front page of the internet',
  NULL,
  NULL
  )

删除声明:

delete from "pages" where "pageUrl" = 'https://www.reddit.com/'

但是,我为插入和删除触发器都收到了SQLITE_MISMATCH: datatype mismatch] errno: 20, code: 'SQLITE_MISMATCH'的错误,我猜这似乎表明错误的数据会进入错误的列,但我&#39 ;我不知道为什么。我已经浏览了docs here中“外部内容表”部分中的触发器部分,并且我已按照列出的内容进行操作,因此我不确定我哪里出错了

任何帮助都将不胜感激。

注意:我正在使用fts5版本的SQLite全文搜索:https://www.sqlite.org/fts5.html

1 个答案:

答案 0 :(得分:1)

content_rowid必须引用实际表的rowid,即INTEGER PRIMARY KEY列。