2016-10-07 74 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塊內,明確控制何時將Realm副本驅逐出去。