Android 在RealmConfiguration生成期间获取旧架构版本

Android 在RealmConfiguration生成期间获取旧架构版本,android,kotlin,realm,Android,Kotlin,Realm,在我目前的项目中,我们有五种不同的海豚王国实例。主应用程序的模式版本现在是5,我们希望将其删除,并完全干净地启动下一个(模式版本6),因为我们启动了应用程序的2.0.0版,并且有一些更改 问题是,在构建领域实例的新配置之前,是否有方法检查其旧模式版本 我们已经尝试使用realmdeletiefmigrationneeded()定义一个特定的模式版本来删除领域,并为以下版本提供一个迁移类。这种方法的问题是,当用户的应用程序版本的架构版本低于指定的版本时,会更新为具有更高版本的应用程序版本,因此我们

在我目前的项目中,我们有五种不同的海豚王国实例。主应用程序的模式版本现在是5,我们希望将其删除,并完全干净地启动下一个(模式版本6),因为我们启动了应用程序的2.0.0版,并且有一些更改

问题是,在构建领域实例的新配置之前,是否有方法检查其旧模式版本

我们已经尝试使用
realmdeletiefmigrationneeded()
定义一个特定的模式版本来删除领域,并为以下版本提供一个迁移类。这种方法的问题是,当用户的应用程序版本的架构版本低于指定的版本时,会更新为具有更高版本的应用程序版本,因此我们有一个需要迁移的异常

我还在这里、这里和这里找到了一个可能的解决方案,分别执行“val realm=DynamicRealm.getInstance(realmConfiguration)”,然后执行“getSchemaVersion()”,但我们真的不知道这是如何工作的,因为当您实际必须设置架构版本时,您必须提供“realmConfiguration”

我将尝试澄清我的问题,我们有以下方法获取领域实例

private val realmConfiguration = buildRealmConfiguration(realmInstance)

private fun buildRealmConfiguration(realmInstance: RealmInstance):
    RealmConfiguration {

    return realmInstance.run {
        val realmBuilder = RealmConfiguration.Builder()
            .name(getName())
            .schemaVersion(schemaVersion.toLong())

        if (this == RealmInstance.IN_MEMORY) {
            realmBuilder.inMemory()
        } else {
            getMigration(realmBuilder, this)
        }

        realmBuilder.build()
    }

fun getInstance(): Realm {
    return Realm.getInstance(realmConfiguration)
}
enum类RealmInstance(val实例:String,val schemaVersion:Int){
MAIN_DB(instance=“MAIN_DB”,schemaVersion=5),
DB2(instance=“DB2”,schemaVersion=1),
...
fun getName()=实例
有趣的迁移(
realmBuilder:RealmConfiguration.Builder,
现实性:现实性
) {
何时(现实){
主数据库->{
/*
由于架构更改,在从应用程序版本1.x.x迁移到版本2.0.0期间,用于删除主_db领域的变量
*/

val migratedoappversion2=realmInstance.schemaVersion您可以使用
realmimiglation
实现来检查旧版本和新版本:

公共类CustomRealmMigration实现RealmMigration{
@凌驾
public void migrate(dynamicrelm领域、long oldVersion、long newVersion){
//做你想做的
}
}
并将其添加到您的
RealmConfiguration
builder:

RealmConfiguration.Builder()
//...
.migration(new CustomRealmMigration())
//...
.build()

您可以使用
realmiglation
实现来检查旧版本和新版本:

公共类CustomRealmMigration实现RealmMigration{
@凌驾
public void migrate(dynamicrelm领域、long oldVersion、long newVersion){
//做你想做的
}
}
并将其添加到您的
RealmConfiguration
builder:

RealmConfiguration.Builder()
//...
.migration(new CustomRealmMigration())
//...
.build()

您可以通过
DynamicRealm.getInstance(realmConfiguration)
打开领域以查看架构版本。如果它小于6,请关闭动态领域,然后调用
Realm.deleteRealm(realmConfiguration)

您可以通过
DynamicRealm.getInstance(realmConfiguration)打开领域
查看架构版本。如果它小于6,请关闭动态域,然后调用
Realm.deleteRealm(realmConfiguration)

我们已经使用
realmiglation
进行迁移(请参阅
RealmIntance
类中的
getMigration()
方法)但这并不是我们要寻找的重点。在迁移过程中,我们无法使用
deleteRealm()
(它还没有构建)删除域实例。如果我们想以艰难的方式删除它们(通过删除数据库文件夹中的域文件),我们将需要
上下文来搜索该文件(我个人认为,如果没有非常合理的动机,
上下文不应该从一个类传递到另一个类)我要求一个更具创造性的解决方案。你不能删除RealMigration中的所有旧实体吗?这很乏味,但会起作用;)你的意思是从模式中删除它们?这不意味着我们必须再次添加它们吗?如果你不是这个意思,我们该怎么做?我考虑将实际的构建器传递给迁移类,构建配置并使用
getRealmDirectory()
在必要时查找并删除所有实例数据库,但不知道它是否有效或是否是一种好的做法如果我正确地得到了您想要的:如果模式版本为X,您希望删除所有内容以获得一个新的开始。如果是这样,您可以删除此处解释的所有类,然后创建所有新类。我是wrong?我们已经使用
realmimiglation
进行迁移(请参阅
RealmIntance
类中的
getMigration()
方法),但这并不是我们要寻找的重点。在迁移过程中,如果我们想以艰难的方式删除域实例,就不能使用
deleteRealm()
(尚未构建)(通过删除数据库文件夹中的领域文件)我们需要一个
上下文
来搜索文件(我个人认为
上下文
不应该在没有合理动机的情况下从一个类传递到另一个类)我在要求一个更具创造性的解决方案。你不能删除RealmMigration中的所有旧实体吗?这很乏味,但会奏效;)你的意思是从模式中删除它们?这不意味着我们必须再次添加它们吗?如果你不是这个意思,我们该怎么做?我考虑将实际的构建器传递给迁移类,构建配置并使用
getRealmDirectory()
在必要时查找并删除所有实例数据库,但不知道它是否有效或是否是一种好的做法如果我正确地得到了您想要的:如果模式版本为X,您希望删除所有内容以获得一个新的开始。如果是这样,您可以删除此处解释的所有类,然后创建所有新类。我是wrong?正如我在问题描述中提到的,我以前确实看到过这个答案,这种方法的问题是,您必须生成一个领域实例(在本例中是动态的),但您必须提供一个“realmConfiguration”