2009-08-24 12 views
1

私はsqliteデータベースを持っており、データベースファイルに対する書き込み操作を行わずに読み取り専用にしたいと考えています。一時的な変更を伴う読み取り専用sqliteデータベース

データベースに永続的にフラッシュすることなく、データベースを一時的に変更する方法はありますか?

今私は回避策の方法で、メインデータベースファイルと同じスキーマ構造を持つインメモリデータベースに一時データを格納することでこれを実行しています。このアプローチの問題は、両方のデータベースですべてのクエリを実行する必要があるため、コードの複雑さが増すことです。

理想的には、問題の解決策は、追加の一時データを、メインデータベースの一部であるかのように扱いますが、実際にディスクにコミットすることはありません。

答えて

2

SQLite is transactionalトランザクションがCOMMITにならないようにする必要があります(SQLiteは接続時に自動的にロールバックします)。 BEGINステートメントを使用して、自動コミットをoffに設定する必要があります。

1

temporary tableを作成すると、接続が閉じられたときに自動的にdbから削除されます。

1
BEGIN IMMEDIATE TRANSACTION; 
do a bunch of stuff; 
ROLLBACK TRANSACTION; 

別のスレッドがデータベースから読み込んでいる場合は、ROLLBACKSQLITE_BUSYで失敗しますが、保留中の仕上げを読み取った後、あなたは再びそれを実行することができます。別のスレッドがデータベースに書き込もうとすると、ロックが解除されます。

ここでは、トランザクションをこのように使用することについて少し面白いことがあります。ネイティブオブジェクトと直接的に連携し、メモリ内の一時的な変更を維持する、データベースとの間にプログラムによるORMスタイルのレイヤーを設ける方法はありますか?

つまり、データベースを変更したくない場合は、データベース機能ではなく別のコード層が必要なのでしょうか?

関連する問題