您的位置:首页 > 移动开发 > Android开发

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

2017-03-16 20:55 162 查看

迁移(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 class
RealmMigration 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 开源