2016-12-16 80 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