2016-10-07 8 views
0

異なるデータベース、つまり領域を切り替える必要があります。特定のフォルダ(「.../database/some.realm」など)にアクティブなデータベースがあり、このデータベースが変更される可能性があります(「.../database/other.realm」など)。我々は現在やっているデータベースを切り替えるには?

はこれです:

(1)前回の運用データベースのために:すべての開いているトランザクションをコミットして無効にします。

 if realm.inWriteTransaction {    
      do {      
       try realm.commitWrite() 
      } catch { 
       ... 
      } 
     } else { 
      ... 
     } 
     realm.invalidate() 

(2)前のデータベースを新しい場所に移動します。

(3)新しいデータベースを運用場所に移動します。

(4)新しいデータベースの場合:新しい構成を作成し、新しい領域を作成します。そこにはエラーはありませんし、新しいデータベースはアプリが次回起動され、適切際に使用されているが

public func openDatabaseAtURL(url: NSURL) { 
    let config = Realm.Configuration(
     fileURL: url, 
     inMemoryIdentifier: nil, 
     encryptionKey: nil, 
     readOnly: false, 
     schemaVersion: self.currentSchemaVersion, 
     migrationBlock: nil, 
     deleteRealmIfMigrationNeeded: false, 
     objectTypes: nil) 
    do { 
     let realm = try Realm(configuration: config) 
     self.realm = realm 
    } catch let error as NSError { 
     ... 
    } catch { 
     ... 
    } 
} 

は、我々はすぐに運用データベースのスイッチを持っていると思います。しかし、レルムの追加ファイル(.lockなど)が作成されていないフォルダのように、レルムが何か起こっていることに気づいていないようで、更新後も古いデータが表示されます。

私たちは間違って何をしていますか?代わりに何をすべきですか? (言い換えれば、古いデータベースを適切に閉じて新しいデータベースを開く方法)

ありがとうございました!新しいコピーが、それが呼ばれるたびに作成されていないので、

  • ハーディ

答えて

0

レルムは内部でスレッド間Realmインスタンスへの参照を保持しています。

残念ながら、実際には、Realmインスタンスにタッチすると、そのインスタンスはメモリに残され、システムが暗黙的に解放するまで後で再利用されます。それまでは、ディスク上の物理ファイルを移動すると、問題が発生します。

Realm()インスタンスを作成する前に、レルムファイルに対してのみファイル操作を実行することをお勧めします。しかし、あなたがそれを避けることができない他の場合には、のコピーが追放されたときに、のブロックに@autoreleasepoolのブロックを書き込むことによって、明示的に制御できます。