需要迁移realm数据库,从realm数据库检索值时在Android中出现异常。

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

在这一行:"realm=Realm.getInstance(getApplicationContext());"中,出现了"io.realm.exceptions.RealmMigrationNeededException: RealmMigration must be provided"。

实际上,由于我对Android和Realm都很陌生,所以很难理解出问题在哪里。

5个回答

80

编辑:对于新版本的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();

在我的 Realm 版本 2.0.0 上,RealmConfiguration config = new RealmConfiguration.Builder(context).deleteRealmIfMigrationNeeded().build()Builder(Context context) 不是公共的。 - Merhawi Fissehaye
4
如果你想知道如何使用“config”,可以尝试以下操作:realm.getInstance(config); - Kai Wang
1
或者只需使用 Realm.setDefaultConfiguration(config) 等方法。 - EpicPandaForce
如果仍然无法解决问题,请尝试重新安装您的应用程序。这对我有用。 - Daniyal Javaid
@RishabhSahrawat 如果你有两个配置,那么你应该使用 RealmConfiguration.Buildername("otherRealm.realm") 参数。你可以使用 setDefaultConfig,但要注意你正在做什么以及何时使用其他配置与 Realm.getInstance(otherRealmConfig) - EpicPandaForce
显示剩余3条评论

20

如果您将应用上传到商店,那么“删除并重新安装应用程序”将不会对其他用户起作用,因此您必须使用“删除”Realm和“重新安装”Realm而不是应用程序。以下是实现方法,希望对您有所帮助!

    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 - yfsx
谢谢,朋友!这非常有帮助,能够解决问题。 - silentsudo

15

您已更改了领域结构。

为了修复它,您应该包括迁移或者简单地卸载并重新安装应用程序。


是的,它起作用了,我重新安装了应用程序...非常感谢伙计。 - Sanket Ranaware
如果您是新手,可以通过“接受”(左侧的“v”标记)将此答案标记为“有效”。 - Lars Celie
我还想问的一件事是,由于我现在已经检索到了“RealmResults <List>”中的值。我的表中有属性“id,name,values”。如何单独获取“values”列的值呢? - Sanket Ranaware
你只能获取整个对象,因此可以执行FindAll()并循环遍历.getValues()部分。 - Lars Celie
例如,我更改了 Realm 的版本并出现了这个错误。只需重新安装即可。 - Mladen Rakonjac
显示剩余3条评论

5
这对我来说没问题。
    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);

    }

-1

Kotlin版本:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接