2016-08-16 2 views
0

В моем последнем выпуске приложения используется не зашифрованное царство. Теперь я хочу обновить, чтобы использовать зашифрованное царство.Как перенести область unencryped для шифрования области

Но я не знаю, как перенести незашифрованные данные.

Помогите мне пожалуйста ~ :(

+0

Мое предположение: вам понадобится миграция (https://realm.io/docs/java/latest/#migrations). Когда вы выполняете эту операцию, вы можете настроить новый файл Realm с помощью конфигураций, которые вы хотели бы включить. – Orlando

+0

@ Орландо Вы имеете в виду, что я должен изменить имя в области? Могу ли я сохранить имя незашифрованной области? – cinabro88

+0

Нет, миграция позволяет создать новую базу данных Realm и скопировать данные из другой ранее существующей базы данных 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 -байт: А). Хорошая находка. – EpicPandaForce

Смежные вопросы