Android 更新领域数据库版本
我在当前的android项目中使用的是realm,版本0.79.0。现在我想将realm版本更新为0.84.0,还想在应用程序类中使用Android 更新领域数据库版本,android,realm,Android,Realm,我在当前的android项目中使用的是realm,版本0.79.0。现在我想将realm版本更新为0.84.0,还想在应用程序类中使用RealmConfiguration来使用realm.getDefaultInstance()而不是realm.getInstance(context)进行领域初始化 我实现了新的领域版本,还更改了必要的配置。但当我运行我的应用程序时,它会崩溃,并出现一个错误 必须提供领域迁移 我以为我没有改变任何模型课 有谁能告诉我,在没有任何迁移的情况下,如何使用Androi
RealmConfiguration
来使用realm.getDefaultInstance()
而不是realm.getInstance(context)
进行领域初始化
我实现了新的领域版本,还更改了必要的配置。但当我运行我的应用程序时,它会崩溃,并出现一个错误
必须提供领域迁移
我以为我没有改变任何模型课
有谁能告诉我,在没有任何迁移的情况下,如何使用Android的默认配置更改realm版本?如果没有迁移是不可能的,那么迁移类会是什么样子?您需要迁移,因为我们在0.83.0中引入了对
null
值的支持。您可以在此处阅读有关如何迁移的更多信息:
但您需要添加如下所示的迁移:
RealmMigration migration = new RealmMigration() {
@Override
public long execute(Realm realm, long version) {
Table table = realm.getTable(Dog.class);
// Needed for all Strings
table.convertColumnToNullable(table.getColumnIndex("name"));
return 1;
}
};
RealmConfiguration realmConfig = new RealmConfiguration.Builder(getContext())
.schemaVersion(1)
.migration(migration)
.build();
嗯,您可能跳过了许多重要的更改。看 0.82 突破性更改:注释为@PrimaryKey的字段现在会自动索引。旧模式需要迁移 您的迁移类应该如下所示:
RealmMigration migration = new RealmMigration() {
@Override
public long execute(Realm realm, long version);
if (version == 1) {
Table table = realm.getTable(Foo.class);
long keyIndex = table.getColumnIndex("id");
table.addSearchIndex(keyIndex);
version++;
}
return version;
}
};
RealmMigration migration = new RealmMigration() {
@Override
public long execute(Realm realm, long version) {
Table table = realm.getTable(Dog.class);
table.convertColumnToNullable(table.getColumnIndex("name"));
return 1;
}
};
来自
0.83
中断更改:引入了装箱类型:布尔型、字节型、短型、整数型、长型、浮点型和双精度型。添加了空支持。引入注释@Required以指示字段不可为空。默认情况下,字符串、日期和字节[]可为空,这意味着如果打开域文件的早期版本,将引发RealmMigrationEndexception
您的迁移类应该如下所示:
RealmMigration migration = new RealmMigration() {
@Override
public long execute(Realm realm, long version);
if (version == 1) {
Table table = realm.getTable(Foo.class);
long keyIndex = table.getColumnIndex("id");
table.addSearchIndex(keyIndex);
version++;
}
return version;
}
};
RealmMigration migration = new RealmMigration() {
@Override
public long execute(Realm realm, long version) {
Table table = realm.getTable(Dog.class);
table.convertColumnToNullable(table.getColumnIndex("name"));
return 1;
}
};
来自1)的示例创建领域迁移类:
公共类ApprealMigration实现RealMigration{
@Override
public void migrate(@NonNull final DynamicRealm realm, long oldVersion, long newVersion) {
// Access the Realm schema in order to create,
// modify or delete classes and their fields.
RealmSchema schema = realm.getSchema();
//region Migrate from version 1 to version 2
if (oldVersion == 1) {
//add your code here...
oldVersion++;
}
}
}
2) 创建自定义应用程序类:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
//cation: never changed Realm filename
//changing this default file name create a new database
//and user after update lose are local data
RealmConfiguration realmConfig = new RealmConfiguration.Builder()
.name("your_realm_name")
.schemaVersion(2)
.migration(new AppRealmMigration())
.build();
Realm.setDefaultConfiguration(realmConfig);
}
}
3) 将此类名添加到应用程序清单:
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
</application>