2016-12-16 7 views
2

私はREAD_ONLYモードで開かれたSQLiteデータベースがあります。仮想テーブルの作成に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 
関連する問題