为什么创建虚拟表需要OPEN_READWRITE模式?

时间:2016-12-16 05:26:43

标签: android sqlite

我在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模式来创建虚拟表,那么这个表写在哪里?它是相同的数据库文件,还是单独的临时数据库文件?

2 个答案:

答案 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