我在READ_ONLY
模式下打开了一个SQLite数据库:
db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.READ_ONLY);
我正在创建一个这样的虚拟表:
db.execSQL("CREATE VIRTUAL TABLE fts_table USING fts3 (name, definition)");
但是,这会产生错误:
android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 8)
如果我使用OPEN_READWRITE
模式,则操作成功。
为什么创建需要OPEN_READWRITE
模式的虚拟表?我以为虚拟表是“虚拟的”,这意味着表没有写入磁盘上的数据库?
如果需要OPEN_READWRITE
模式来创建虚拟表,那么这个表写在哪里?它是相同的数据库文件,还是单独的临时数据库文件?
答案 0 :(得分:3)
Virtual tables
不需要磁盘上的物理表,但full text search
(FTS)模块会为它创建的影子表执行此操作。
影子表
对于数据库中的每个FTS虚拟表,创建三到五个真实(非虚拟)表来存储基础数据。这些真实的表被称为"影子表"。真实表名为
"%_content"
,"%_segdir"
,"%_segments"
,"%_stat"
和"%_docsize"
,其中"%"
由FTS的名称替换虚拟表。
答案 1 :(得分:1)
有些虚拟表(如FTS)可以将数据存储在数据库中。
但即使虚拟表模块访问外部数据,或只是发明数据,实际的虚拟表定义本身(CREATE VIRTUAL TABLE
语句)仍然存储在数据库中,然后虚拟表是持久性部分像任何其他表或视图一样的数据库。
要查看存储在数据库中的所有表定义,请执行:
SELECT name, sql FROM sqlite_master WHERE type = 'table';
对于仅在当前连接中可见且自动删除的表,您必须创建一个临时表:
CREATE TEMP TABLE MyTable(...); -- normal table
CREATE VIRTUAL TABLE temp.MyTable USING ...(...); -- virtual table