<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开源库> Realm For Android~ Getting Help and Models(译文)
- <Android开源库> Realm For Android~ Getting Started(译文)
- <Android开源库> Realm For Android~ Scheme & JSON & Notification(译文)
- <Android开源库> Realm For Android~ Adapter &Supporting other library(译文)
- <Android开源库> Realm For Android~ Threading(译文)
- <Android开源库> Realm For Android~ RelationShips and Writes(译文)
- <Android开源库> Realm For Android~ Queries(译文)
- <Android开源库> Realm For Android~ Realm(译文)
- <Android开源库> Essential介绍 <译文>
- <Android开源库> MPAndroidChart Wiki(译文)~Part 6
- <Android开源库> Retrofit & WebService
- <Android 开源库> GreenDAO 用法详解<译文>
- <Android开源库> MPAndroidChart Wiki(译文)~Part 3
- <Android开源库> MPAndroidChart Wiki(译文)~Part 5
- <Android开源库> MPAndroidChart Wiki(译文)~Part 1
- <Android开源库> MPAndroidChart Wiki(译文)~Part 4
- <Android开源库> EventBus 用法详解<译文>
- <Android开源库> MPAndroidChart Wiki(译文)~Part 2
- <错误处理> Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessExc
- Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessException