"realm migration needed",从realm db中检索值时android中的异常

San*_*are 39 android realm

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

"io.realm.exceptions.RealmMigrationNeededException:必须提供RealmMigration":"realm = Realm.getInstance(getApplicationContext());".

实际上,我是android和Realm的新手,所以找麻烦来理解什么是问题.

191*_*11z 74

编辑:对于Realm的新版本,添加了Realm.init(上下文上下文)

Realm.init(context);    
RealmConfiguration config = new RealmConfiguration
                                     .Builder()
                                     .deleteRealmIfMigrationNeeded()
                                     .build();
Run Code Online (Sandbox Code Playgroud)

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

  • 添加/删除字段
  • 添加了一个新的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 
Run Code Online (Sandbox Code Playgroud)

Realm.init(context);    
RealmConfiguration config = new RealmConfiguration.Builder() 
                                 .migration(new Migration()) 
                           //      .deleteRealmIfMigrationNeeded()
                                 .build();
Run Code Online (Sandbox Code Playgroud)

  • 如果您想知道如何使用"config",请尝试以下方法:realm.getInstance(config); (4认同)

yfs*_*fsx 19

如果您将应用程序上传到商店,"删除并重新安装应用程序"将不会对其他用户起作用,因此您必须使用"删除"领域并"重新安装"领域,而不是应用程序.这是方法,希望它会有所帮助!

    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.
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑

对于最新的Realm(3.0.0),Realm更改了构造函数结构,因此您必须执行以下操作:

Realm.init(context);    
RealmConfiguration config = new RealmConfiguration
                                 .Builder()
                                 .deleteRealmIfMigrationNeeded()
                                 .build();
Run Code Online (Sandbox Code Playgroud)


Lar*_*lie 13

你改变了一些领域结构.

要修复它,您应该包括迁移, 或者只是删除应用程序并再次安装它.


Ced*_*iga 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);

    }
Run Code Online (Sandbox Code Playgroud)