0

我正在尝试为常规表创建触发器,然后更新 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'插入和删除触发器都出现错误,我猜这似乎表明错误的数据进入了错误的列,但我不确定为什么。我已经浏览了此处文档的外部内容表部分中的触发器部分,并且我已经按照列出的内容进行操作,所以我不确定我哪里出错了。

任何帮助,将不胜感激。

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

4

1 回答 1

1

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

于 2016-02-26T08:04:08.130 回答