进行领域迁移的正确方法 Android
Right way of doing Realm Migration Android
我们的应用程序使用 Realm。我们的应用程序已发布测试版。现在我想向我们的领域对象之一添加一个字段。所以我必须写 RealmMigration 并且我也写了一个。这里的问题是如何将此领域迁移应用到我的应用程序。每当我想要某些东西时,我都会使用 Realm.getInstance() 获取领域实例。请记住,Realm.getInstance() 每次都在整个应用程序中使用,我想访问 Realm 数据库。
所以,我有点想知道如何应用此迁移?任何线索都会有所帮助。谢谢
我的RealmMigration如下
public class RealmMigrationClass implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
if(oldVersion == 0) {
RealmSchema sessionSchema = realm.getSchema();
if(oldVersion == 0) {
RealmObjectSchema sessionObjSchema = sessionSchema.get("Session");
sessionObjSchema.addField("isSessionRecordingUploading", boolean.class, FieldAttribute.REQUIRED)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
obj.set("isSessionRecordingUploading", false);
}
});
sessionObjSchema.setNullable("isSessionRecordingUploading",false);
oldVersion++;
}
}
}
}
public class Session extends RealmObject {
@PrimaryKey
private String id;
@Required
private Date date;
private double latitude;
private double longitude;
private String location;
private String note;
private String appVersion;
private String appType;
private String deviceModel;
private HeartRecording heart;
private TemperatureRecording temperature;
private LungsRecording lungs;
@NotNull
private boolean isSessionRecordingUploading;
private boolean sessionInfoUploaded;
private boolean lungsRecordingUploaded;
private boolean heartRecordingUploaded;
}
从 RealmObject 中删除了 Getter 和 Setters 以缩短问题。当我尝试重新安装应用程序而不卸载之前的应用程序时发生异常。请指教
此处描述:https://realm.io/docs/java/latest/#migrations
但本质上,您只是修改架构版本并像这样设置配置:
RealmConfiguration config = new RealmConfiguration.Builder(context)
.schemaVersion(2) // Must be bumped when the schema changes
.migration(new MyMigration()) // Migration to run
.build();
Realm.setDefaultConfiguration(config);
// This will automatically trigger the migration if needed
Realm realm = Realm.getDefaultInstance();
这是我用来将 .realm 数据库导入我的应用程序的助手 class。就我而言,我只需要在 Android 应用程序
中读取从 iOS 应用程序创建的数据库
public class RealmImporter {
private Activity activity;
private String dbaFullName = "db.realm";
private int rawRealmResource = R.raw.dbRealmResource;
public RealmImporter (Activity activity) {
this.activity = activity;
importData();
}
private RealmConfiguration getConfiguration() {
RealmConfiguration config = new RealmConfiguration.Builder()
.name(dbaFullName)
.modules(new MyRealmModule())
.migration(new RealmMigration() {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
}
})
.build();
return config;
}
public Realm getInstance() {
Realm realm = Realm.getInstance(getConfiguration());
return realm;
}
private void importData() {
copyBundledRealmFile(activity.getResources().openRawResource(rawRealmResource), dbaFullName);
Realm.init(activity);
}
private String copyBundledRealmFile(InputStream inputStream, String outFileName) {
try {
File file = new File(activity.getFilesDir(), outFileName);
if (file.exists()) {
return file.getAbsolutePath();
}
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, bytesRead);
}
outputStream.close();
return file.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// Create the module
@RealmModule(classes = { Artigo.class, Comparativo.class, Indice.class, ItemDeArtigo.class})
public static class MyRealmModule{
}
}
如果您有多个领域配置(如果您需要导入多个 .realm 文件),您需要创建一个 RealmModule class 并在 [=22] 上使用 .modules() 选项=]。
这是必需的,因为默认情况下,realm 会尝试检查您的 .realm 是否包含所有扩展 RealmObject 的模型的表,如果您有多个 .realm,那么每个 .realm 都会包含您的一些 classes(但不是全部)。
另一个有用的信息是 swift 到 android 的迁移。所有 String 属性都必须使用 @Required 注释声明(如果它们具有默认值)。
如果 realm 给你一个奇怪的异常,比如 "this class was not found in this schema",试着重新 运行 你的应用程序,通常它会给出一个不同的错误,它可以提示真正的问题,虽然有时它只是给出一个随机误差。
我们的应用程序使用 Realm。我们的应用程序已发布测试版。现在我想向我们的领域对象之一添加一个字段。所以我必须写 RealmMigration 并且我也写了一个。这里的问题是如何将此领域迁移应用到我的应用程序。每当我想要某些东西时,我都会使用 Realm.getInstance() 获取领域实例。请记住,Realm.getInstance() 每次都在整个应用程序中使用,我想访问 Realm 数据库。
所以,我有点想知道如何应用此迁移?任何线索都会有所帮助。谢谢
我的RealmMigration如下
public class RealmMigrationClass implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
if(oldVersion == 0) {
RealmSchema sessionSchema = realm.getSchema();
if(oldVersion == 0) {
RealmObjectSchema sessionObjSchema = sessionSchema.get("Session");
sessionObjSchema.addField("isSessionRecordingUploading", boolean.class, FieldAttribute.REQUIRED)
.transform(new RealmObjectSchema.Function() {
@Override
public void apply(DynamicRealmObject obj) {
obj.set("isSessionRecordingUploading", false);
}
});
sessionObjSchema.setNullable("isSessionRecordingUploading",false);
oldVersion++;
}
}
}
}
public class Session extends RealmObject {
@PrimaryKey
private String id;
@Required
private Date date;
private double latitude;
private double longitude;
private String location;
private String note;
private String appVersion;
private String appType;
private String deviceModel;
private HeartRecording heart;
private TemperatureRecording temperature;
private LungsRecording lungs;
@NotNull
private boolean isSessionRecordingUploading;
private boolean sessionInfoUploaded;
private boolean lungsRecordingUploaded;
private boolean heartRecordingUploaded;
}
从 RealmObject 中删除了 Getter 和 Setters 以缩短问题。当我尝试重新安装应用程序而不卸载之前的应用程序时发生异常。请指教
此处描述:https://realm.io/docs/java/latest/#migrations
但本质上,您只是修改架构版本并像这样设置配置:
RealmConfiguration config = new RealmConfiguration.Builder(context)
.schemaVersion(2) // Must be bumped when the schema changes
.migration(new MyMigration()) // Migration to run
.build();
Realm.setDefaultConfiguration(config);
// This will automatically trigger the migration if needed
Realm realm = Realm.getDefaultInstance();
这是我用来将 .realm 数据库导入我的应用程序的助手 class。就我而言,我只需要在 Android 应用程序
中读取从 iOS 应用程序创建的数据库public class RealmImporter {
private Activity activity;
private String dbaFullName = "db.realm";
private int rawRealmResource = R.raw.dbRealmResource;
public RealmImporter (Activity activity) {
this.activity = activity;
importData();
}
private RealmConfiguration getConfiguration() {
RealmConfiguration config = new RealmConfiguration.Builder()
.name(dbaFullName)
.modules(new MyRealmModule())
.migration(new RealmMigration() {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
}
})
.build();
return config;
}
public Realm getInstance() {
Realm realm = Realm.getInstance(getConfiguration());
return realm;
}
private void importData() {
copyBundledRealmFile(activity.getResources().openRawResource(rawRealmResource), dbaFullName);
Realm.init(activity);
}
private String copyBundledRealmFile(InputStream inputStream, String outFileName) {
try {
File file = new File(activity.getFilesDir(), outFileName);
if (file.exists()) {
return file.getAbsolutePath();
}
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, bytesRead);
}
outputStream.close();
return file.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// Create the module
@RealmModule(classes = { Artigo.class, Comparativo.class, Indice.class, ItemDeArtigo.class})
public static class MyRealmModule{
}
}
如果您有多个领域配置(如果您需要导入多个 .realm 文件),您需要创建一个 RealmModule class 并在 [=22] 上使用 .modules() 选项=]。
这是必需的,因为默认情况下,realm 会尝试检查您的 .realm 是否包含所有扩展 RealmObject 的模型的表,如果您有多个 .realm,那么每个 .realm 都会包含您的一些 classes(但不是全部)。
另一个有用的信息是 swift 到 android 的迁移。所有 String 属性都必须使用 @Required 注释声明(如果它们具有默认值)。
如果 realm 给你一个奇怪的异常,比如 "this class was not found in this schema",试着重新 运行 你的应用程序,通常它会给出一个不同的错误,它可以提示真正的问题,虽然有时它只是给出一个随机误差。