<Android开源库> Realm For Android~ Migrations & Encryption & Working With Android(译文)

来源:互联网 发布:茉莉茶软化宫颈 知乎 编辑:程序博客网 时间:2024/05/22 05:08

迁移(Migrations)

所有数据库都要处理模型改变的情况。Realm 的数据模型用标准 Java 对象来定义,改变Scheme和改变数据RealmObject子类对应的机构一样容易。

如果没有旧 Realm 数据文件存在,那么代码的改变即会反应到相应的 Realm 数据文件改变。但如果已经有旧版本的 Realm 数据文件存在,Realm 会抛出异常提示数据库文件需要迁移。请在相应的 RealmConfiguration 设置 schema 版本和 migration 代码来正确处理并避免该异常抛出。

RealmConfiguration config = new RealmConfiguration.Builder()    .schemaVersion(2) // Must be bumped when the schema changes    .migration(new MyMigration()) // Migration to run instead of throwing an exception    .build()

如上示例使得相应的 migration 代码在迁移需要的时候被自动执行。我们提供了相关 API 用来升级已保存的 schema 以及对应之前 schema 的数据。

// Example migration adding a new classRealmMigration migration = new RealmMigration() {  @Override  public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {     // DynamicRealm exposes an editable schema     RealmSchema schema = realm.getSchema();     // Migrate to version 1: Add a new class.     // Example:     // public Person extends RealmObject {     //     private String name;     //     private int age;     //     // getters and setters left out for brevity     // }     if (oldVersion == 0) {        schema.create("Person")            .addField("name", String.class)            .addField("age", int.class);        oldVersion++;     }     // Migrate to version 2: Add a primary key + object references     // Example:     // public Person extends RealmObject {     //     private String name;     //     @PrimaryKey     //     private int age;     //     private Dog favoriteDog;     //     private RealmList<Dog> dogs;     //     // getters and setters left out for brevity     // }     if (oldVersion == 1) {        schema.get("Person")            .addField("id", long.class, FieldAttribute.PRIMARY_KEY)            .addRealmObjectField("favoriteDog", schema.get("Dog"))            .addRealmListField("dogs", schema.get("Dog"));        oldVersion++;     }  }}

请查阅这个数据迁移例子来获取这方面的细节。

如果没有旧 Realm 数据文件存在,那么迁移并不需要,在这种情况下,Realm 会创建一个新的以 .realm 为后缀,基于新的对象模型的数据文件。在开发和调试过程中,假如你需要频繁改变数据模型,并且不介意损失旧数据,你可以直接删除 .realm 文件(这里包含所有的数据!)而不用关心迁移的问题。这在你应用的开发早期阶段非常有用。

RealmConfiguration config = new RealmConfiguration.Builder()    .deleteRealmIfMigrationNeeded()    .build()

加密

请注意我们的许可证的出口合规性部分,因为如果你位于从美国出口限制或禁运的国家,则会限制使用Realm。

Realm 文件可以通过传递一个512位(64字节)的密钥参数给 Realm.getInstance().encryptionKey() 来加密存储在磁盘上。

byte[] key = new byte[64];new SecureRandom().nextBytes(key);RealmConfiguration config = new RealmConfiguration.Builder()  .encryptionKey(key)  .build();Realm realm = Realm.getInstance(config);

这保证了所有永久性存储在磁盘上的数据都是通过标准 AES-256 加密的。每次创建新的 Realm 实例的时候,都需要提供相同的密钥。

参考 examples/encryptionExample。这个例子演示了如何通过 Android KeyStore 来安全地存储密钥。


与 Android 相关

Realm 可以无缝地引入安卓开发。你需要谨记 RealmObject 的线程限制。当你需要跨 activity、service或者 broadcast receiver 传递 Realm 对象的时候,请牢记这一点.


原文地址

https://realm.io/docs/java/latest/#migrations

1 0
原创粉丝点击