2017-05-12 9 views
1

レルムをキャッシュとして使用しているので、レルムを削除し、レルム内のいずれかのスキーマを変更すると、最初からやり直すという考えがありました。マイグレーションを行う代わりにレルムを削除できますか?

これは良い戦略ですか?気にするものは何ですか?ここで

は、いくつかのサンプルコードです:

class RealmHelper { 
    static let SCHEMA_NUMBER = 5 
    static let SCHEMA_NUMBER_KEY = "Neutum:RealmHelper:SCHEMA_NUMBER" 

    /// Realm property. This is a computed property to keep thread-safety, 
    static var realm: Realm = { 
     let defaults = UserDefaults.standard 
     // By default is 0 
     let schemaNumber = defaults.integer(forKey: SCHEMA_NUMBER_KEY) 

     if schemaNumber < SCHEMA_NUMBER { 
      RealmHelper.dangerousDeleteAllRealmData() 
      defaults.set(SCHEMA_NUMBER, forKey: SCHEMA_NUMBER_KEY) 
     } 

     return try! Realm() 
    }() 

    /// Should only be used in the static intializer. That is, this will cause 
    /// issues if there are any active instances of Realm. 
    /// 
    /// See the documentation: https://realm.io/docs/swift/latest/#deleting-realm-files 
    static func dangerousDeleteAllRealmData() { 
     let realmURL = Realm.Configuration.defaultConfiguration.fileURL! 
     do { 
      try FileManager.default.removeItem(at: realmURL) 

      var lockURL = realmURL 
      lockURL.appendPathComponent("lock") 
      try FileManager.default.removeItem(at: lockURL) 

      var logAURL = realmURL 
      logAURL.appendPathComponent("log_a") 
      try FileManager.default.removeItem(at: logAURL) 

      var logBURL = realmURL 
      logBURL.appendPathComponent("log_b") 
      try FileManager.default.removeItem(at: logBURL) 

      var noteURL = realmURL 
      noteURL.appendPathComponent("note") 
      try FileManager.default.removeItem(at: noteURL) 
     } catch { 
      // Do nothing (apparently can't even log ErrorType) 
     } 
    } 
} 

答えて

3

私は強くちょうどあなたRealm.ConfigurationtruedeleteRealmIfMigrationNeededを設定することをお勧めします。

ドキュメント:私は、移行の問題を防ぐために、キャッシュとしてレルムを使用https://realm.io/docs/swift/latest/api/Classes/Realm/Configuration.html#/s:vVC10RealmSwift5Realm13Configuration28deleteRealmIfMigrationNeededSb

マイ拡張子:

extension Realm 
{ 
    static var cacheConfig: Realm.Configuration { 
     let cacheDirs = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true) 
     let cacheURL = URL(fileURLWithPath: cacheDirs.first!) 

     return Realm.Configuration(
      fileURL: cacheURL.appendingPathComponent("cache.realm"), 
      inMemoryIdentifier: nil, 
      syncConfiguration: nil, 
      encryptionKey: nil, 
      readOnly: false, 
      schemaVersion: 0, 
      migrationBlock: nil, 
      deleteRealmIfMigrationNeeded: true, 
      objectTypes: nil 
     ) 
    } 

    static var cache: Realm { 
     do { 
      return try Realm(configuration: Realm.cacheConfig) 
     } 
     catch let error as NSError { 
      ... handle error ... 
     } 
    } 
} 

そして、私はキャッシュにアクセスしたいときだけRealm.cache...を使用しています。

同様:Realm.cache.objects(Responses.self)

+0

完璧な答えは、ありがとうございました! –

関連する問題