如何迁移未加密的域以加密域

时间:2016-08-16 08:31:33

标签: android realm

我的上一个发布应用程序使用的是未加密的域。 现在,我想更新以使用加密领域。

但我不知道如何迁移未加密的数据。

请帮帮我〜:(

2 个答案:

答案 0 :(得分:4)

自己回答。 我创建了util类来帮助迁移。 (未加密的文件 - >加密文件)

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();
                }
            }
        }
    }
}

答案 1 :(得分: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();
            }
        }
    }