2016-12-16 78 views
2

我有一个SQLite数据库中READ_ONLY模式打开:为什么创建虚拟表需要OPEN_READWRITE模式?

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

回答

3

Virtual tables不需要磁盘上的物理表,但full text search(FTS)模块会为其创建的影子表执行操作。

影子表

For each FTS virtual table in a database, three to five real (non-virtual) tables are created to store the underlying data. These real tables are called "shadow tables". The real tables are named "%_content" , "%_segdir" , "%_segments" , "%_stat" , and "%_docsize" , where "%" is replaced by the name of the FTS virtual table.

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