“需要领域迁移”,从领域数据库中检索值时出现异常

Posted

技术标签:

【中文标题】“需要领域迁移”,从领域数据库中检索值时出现异常【英文标题】:"realm migration needed", exception in android while retrieving values from realm db 【发布时间】:2016-02-29 15:26:36 【问题描述】:

我在我的应用程序中使用 Realm 作为后端。我创建了一个名为 Setting 的表。我按照 Realm 官方网站上给出的步骤在该表中添加了值。 但是当我要从该表中检索值时,我得到了异常

“io.realm.exceptions.RealmMigrationNeededException: RealmMigration must be provided”就行了:“realm=Realm.getInstance(getApplicationContext());”。

实际上,我是 android 和 Realm 的新手,所以很难理解是什么问题。

【问题讨论】:

【参考方案1】:

编辑:对于新版本的 Realm,添加了 Realm.init(Context context)

Realm.init(context);    
RealmConfiguration config = new RealmConfiguration
                                     .Builder()
                                     .deleteRealmIfMigrationNeeded()
                                     .build();

注意:使用此配置选项,任何架构更改都会导致 数据丢失,具体而言:

添加/删除字段 添加了一个新的 RealmObject 类 现有的 RealmObject 已被移除 @Required 已添加/删除 @PrimaryKey 已添加/删除 @Index 已添加/删除

因此,主要建议在应用处于开发阶段时使用。


或者按照官方文档添加迁移:

https://realm.io/docs/java/latest/#migrations

例如,

public class Migration implements RealmMigration 
    @Override
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) 
        RealmSchema schema = realm.getSchema();

        if (oldVersion == 0) 
            RealmObjectSchema personSchema = schema.get("Person");
            personSchema
                .addField("fullName", String.class, FieldAttribute.REQUIRED);
            oldVersion++;
            ... 

  // hash code, equals 

Realm.init(context);    
RealmConfiguration config = new RealmConfiguration.Builder() 
                                 .migration(new Migration()) 
                           //      .deleteRealmIfMigrationNeeded()
                                 .build();

【讨论】:

RealmConfiguration config = new RealmConfiguration.Builder(context).deleteRealmIfMigrationNeeded().build() 在我的领域版本 2.0.0 上。 Builder(Context context) 不公开 如果你想知道如何使用“config”,试试这个:realm.getInstance(config); 或者只是Realm.setDefaultConfiguration(config)等等。 如果仍然无法正常工作,请尝试重新安装您的应用。为我工作 @EpicPandaForce 如果我们在同一个应用程序中有两个数据库要访问,那么如何设置一个设置默认配置,领域不总是只使用默认配置文件吗?请解释。如果我要使用多个数据库,我很难理解这个概念。【参考方案2】:

如果您将应用程序上传到商店,“删除并重新安装应用程序”对其他用户将不起作用,因此您必须使用“删除”领域和“重新安装”领域,而不是应用程序。方法就是这样,希望对你有帮助!!

    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();

    try 
        return Realm.getInstance(realmConfiguration);
     catch (RealmMigrationNeededException e)
        try 
            Realm.deleteRealm(realmConfiguration);
            //Realm file has been deleted.
            return Realm.getInstance(realmConfiguration);
         catch (Exception ex)
            throw ex;
            //No Realm file to remove.
        
    

编辑

对于最新的 Realm (3.0.0),Realm 改变了构造函数结构,所以你必须这样做:

Realm.init(context);    
RealmConfiguration config = new RealmConfiguration
                                 .Builder()
                                 .deleteRealmIfMigrationNeeded()
                                 .build();

【讨论】:

实际上 RealmMigration 是解决您问题的最佳答案,但不知何故我无法在我的应用程序中实施 RealmMigration :s 谢谢哥们,这对解决问题很有帮助【参考方案3】:

你改变了领域结构。

为了修复它,您应该包含migration 或者干脆删除应用程序并重新安装。

【讨论】:

是的,它成功了,我重新安装了应用程序...非常感谢哥们 如果您是新手,您可以通过“接受”来将此答案标记为“有效”。 (左侧有一个“v”标记) 我还想问一件事,因为我现在已经在“RealmResults”中检索了值。我的表中有属性为“id、name、values”。如何分别获取“值”列的值..”??? 您只能获取整个对象,因此您可以执行 FindAll() 并循环 .getValues() 部分 实际上它没有显示getValues()的选项,但我确实get(i);但它提供了整行,我想要该行中的单个值。我的代码是“settingDataList.get(0);”【参考方案4】:

这对我有用

    Realm.init(context);
    Realm realm;
    try
        realm = Realm.getDefaultInstance();

    catch (Exception e)

        // Get a Realm instance for this thread
        RealmConfiguration config = new RealmConfiguration.Builder()
                .deleteRealmIfMigrationNeeded()
                .build();
        realm = Realm.getInstance(config);

    

【讨论】:

【参考方案5】:

Kotlin 版本:

val realm = try 
            Realm.init(this)
            val config = RealmConfiguration.Builder()
                    .deleteRealmIfMigrationNeeded()
                    .build()
            Realm.getInstance(config)
         catch (ex: RealmMigrationNeededException) 
            Realm.getDefaultInstance()
        

【讨论】:

以上是关于“需要领域迁移”,从领域数据库中检索值时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

仅在运行单元测试时出现 OLE DB 异常“类未注册”

尝试从 Access 数据库中搜索时出现 C#OleDb 异常“没有为一个或多个必需参数提供值”[关闭]

尝试从 Apache Beam 中的选项获取值时出现空指针异常

使用从 JSON 数据中提取的值时出现 NSInvalidArgumentException

从(视频)帧英特尔实感获取 RGB 值时出现指针异常

从 mysql 数据库中检索图像时引发异常