2016-08-16 7 views
0

私の最後のリリースのアプリは暗号化されていないレルムを使用しています。 暗号化された領域を使用するように更新したいと思います。暗号化されていないレルムをマイグレーションしてレルムを暗号化する方法

しかし、暗号化されていないデータを移行する方法はわかりません。

〜私を助けてください:(

+0

マイグレーションが必要です(https://realm.io/docs/java/latest/#migrations )。この操作を実行すると、新しいRealmファイルを設定することができます。 – Orlando

+0

@オランダあなたは私が領域名を変えるべきであることを意味しますか?暗号化されていないレルム名を保持できますか? – cinabro88

+0

いいえ、移行により、新しいRealmデータベースを作成し、既存の別のRealmデータベースからデータをコピーすることができます。作成されるデータベースの新しい名前を選択しますが、最後に名前は無関係です。暗号化されたレルムへの移行が完了すると、新しいレルム名を以前の名前に変更することもできます。 – Orlando

答えて

0

@Orlando

このような

class EncryptionMigration implements RealmMigration { 
    @Override 
    public void migrate(DynamicRealm dynamicRealm, long oldVersion, long newVersion) { 
     byte[] encryptionKey = "flkajskdf............................".getBytes(); 

     if (oldVersion == UNENCRYPT_VERSION) { 
      try { 
       dynamicRealm.writeEncryptedCopyTo(new File(dynamicRealm.getPath()), encryptionKey); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

これは動作しません – cinabro88

2

自分で回答 私は、移行を支援するutilのクラスを作った(unecncryptedファイル - ?。。> encrpytedファイル)

public class RealmEncryptionHelper { 
    private static final String ENCRYPTION_FILE_PREFIX = "encrypted_"; 

    public static Realm createEncryptedRealm(Context context, RealmConfiguration.Builder builder) { 
     RealmConfiguration unencryptedConfig = builder.build(); 

     RealmConfiguration encryptedConfig = builder.name(ENCRYPTION_FILE_PREFIX + unencryptedConfig.getRealmFileName()) 
       .encryptionKey(AppSharedPreferences.getInstance(context).getRealmEncryptionKey()) 
       .build(); 

     migrationIfNeeded(unencryptedConfig, encryptedConfig); 

     return Realm.getInstance(encryptedConfig); 
    } 

    private static void migrationIfNeeded(RealmConfiguration unencryptedConfig, RealmConfiguration encryptedConfig) { 
     File unencryptedFile = new File(unencryptedConfig.getPath()); 
     File encryptedFile = new File(encryptedConfig.getPath()); 

     Realm unencryptedRealm = null; 
     if (!encryptedFile.exists() && unencryptedFile.exists()) { 
      try { 
       unencryptedRealm = Realm.getInstance(unencryptedConfig); 
       unencryptedRealm.writeEncryptedCopyTo(encryptedFile, encryptedConfig.getEncryptionKey()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (unencryptedRealm != null) { 
        unencryptedRealm.close(); 
       } 
      } 
     } 
    } 
} 
+0

うわー、私は[writeEncryptedCopyTo]について知りませんでした(https://realm.io/docs/java/latest/api/io/realm/Realm.html#writeEncryptedCopyTo-java.io.File -byte:A-)。ニースを見つける。 – EpicPandaForce

関連する問題