2016-02-26 53 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