2016-02-26 135 views
1

我想为常规表创建触发器,然后在SQLite中更新全文索引,但是我收到一些错误,但我不确定我在哪里,出错了。在SQLite中为全文搜索索引创建SQL触发器

我做这个应用程序是一个书签应用程序,数据库I保存到使用下面的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 
); 

因此,我想通过插入或删除更新“pages”表时更新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',我想这似乎表明错误的数据将进入错误的列,但我不知道为什么。我已经浏览了docs here的“外部内容表”部分中的触发器部分,并且我遵循了列出的内容,因此我不确定我要出错的位置。

任何帮助,将不胜感激。

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

回答

1

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