2016-03-05 2 views
5

レルムスウィフトは新しいキー(ファイル名は同じ)で新しい暗号化レルムファイルを安全に削除して作成する方法はありますか?レルムスウィフトiOS - 暗号化されたレルムを安全に削除して再キーイングする

私のユースケース:

static func deleteRealm() { 
    let configuration = Realm.Configuration()  
    let path = NSURL.fileURLWithPath(configuration.path!)  
        .URLByDeletingLastPathComponent? 
        .URLByAppendingPathComponent("encrypted.realm") 
        .path! 
    if NSFileManager.defaultManager().fileExistsAtPath(path) { 
     // Delete realm 
     try! NSFileManager.defaultManager().removeItemAtPath(path) 
    } 
    } 
} 

(残念ながら、realm.deleteAll()の呼び出しは、十分ではありません:暗号化キーも削除されますので、ユーザがログイン私のアプリのうち、私は、暗号化された.realmファイルを削除新しいキー)

でもありますので、内の別のユーザーがログイン直後にログアウトし、私はこのように、新しいキーで暗号化されたレルムDBを再intializeしようとしたとき:

static func intializeRealm() -> Realm! { 
    let realmKey = generateSecureRealmKey() 
    var configuration = Realm.Configuration() 
    configuration.path = RealmDB.getRealmPath() 
    configuration.encryptionKey = NSData(bytes: realmKey, length: realmKey.count) 
    return try! Realm(configuration: configuration) 
    } 

私はこの例外を取得:(ファイル名が同じであるため)

*** Terminating app due to uncaught exception 'RLMException', 
     reason: 'Realm at path '****/encrypted.realm' already opened 
     with different encryption key' 

レルムファイルが削除されているにもかかわらず、古いconfiguration cacheがまだ使用されているようです。

sample encryption app for Realm Swiftはこれを回避するためにautoreleasepoolを使用していますが、それはもっと大きなアプリでは実現できません。またはそれは?私は領域のすべての用途をautoreleasepoolで囲む必要がありますか?

答えて

1

既存のレルムデータベースを削除するか、同じパスに新しい暗号化キーを使用して新しいレルムデータベースを作成する前に、すべてのレルムアクセサが閉じていることを確認する必要があります。しかし、あなたが指摘しているように、それは大きなアプリでは達成するのが難しいかもしれません。最も簡単な方法はおそらく新しいファイルパスを使用することです。そのため、次のアプリケーションの起動に実際のデータベース自体の削除を後処理することをお勧めします。現在使用されているレルムへのパスを保存し、他のすべての.realmファイルとその補助ファイルをすべて同じディレクトリに削除することで、これを実現できます。

関連する問題