我正在开发字典应用程序,该应用程序使用FTS表提供搜索。
这些定义来自预先打包的数据库,该数据库具有以下架构:(.schema
从Linux上的sqlite3程序输出)
sqlite> .open words.db
sqlite> .schema
CREATE TABLE entries
(id INTEGER PRIMARY KEY NOT NULL,word TEXT NOT NULL COLLATE NOCASE,wordtype TEXT NOT NULL COLLATE NOCASE,definition TEXT NOT NULL COLLATE NOCASE);
CREATE INDEX words_index ON entries(id,word);
CREATE VIRTUAL TABLE entriesFts USING FTS4(content='entries',word)
/* entriesFts(word) */;
CREATE TABLE IF NOT EXISTS 'entriesFts_segments'(blockid INTEGER PRIMARY KEY,block BLOB);
CREATE TABLE IF NOT EXISTS 'entriesFts_segdir'(level INTEGER,idx INTEGER,start_block INTEGER,leaves_end_block INTEGER,end_block INTEGER,root BLOB,PRIMARY KEY(level,idx));
CREATE TABLE IF NOT EXISTS 'entriesFts_docsize'(docid INTEGER PRIMARY KEY,size BLOB);
CREATE TABLE IF NOT EXISTS 'entriesFts_stat'(id INTEGER PRIMARY KEY,value BLOB);
我的实体定义如下:
@Entity(tableName="entries",indices = [Index(name = "words_index",value = ["id","word"])])
data class Word (
@PrimaryKey val id :Int,@ColumnInfo val word :String,@ColumnInfo(name = "wordtype") val wordType :String,@ColumnInfo val definition :String
)
/* Used when displaying list of words */
@Fts4(contentEntity = Word::class)
@Entity(tableName = "entriesFts")
data class WordMinimal (
@PrimaryKey @ColumnInfo(name = "rowid") val id :Int,@ColumnInfo val word :String
)
在我看来,这些模式完全匹配,但是Room的看法不同:/
它在logcat中引发此错误:
java.lang.IllegalStateException: pre-packaged database has an invalid schema: entriesFts(rawderm.dictionary.en.db.WordMinimal).
Expected:
FtsTableInfo{name='entriesFts',columns=[word],options=[content=`entries`]}
Found:
FtsTableInfo{name='entriesFts',options=[content='entries']}