Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更新领域数据库版本_Android_Realm - Fatal编程技术网

Android 更新领域数据库版本

Android 更新领域数据库版本,android,realm,Android,Realm,我在当前的android项目中使用的是realm,版本0.79.0。现在我想将realm版本更新为0.84.0,还想在应用程序类中使用RealmConfiguration来使用realm.getDefaultInstance()而不是realm.getInstance(context)进行领域初始化 我实现了新的领域版本,还更改了必要的配置。但当我运行我的应用程序时,它会崩溃,并出现一个错误 必须提供领域迁移 我以为我没有改变任何模型课 有谁能告诉我,在没有任何迁移的情况下,如何使用Androi

我在当前的android项目中使用的是realm,版本0.79.0。现在我想将realm版本更新为0.84.0,还想在应用程序类中使用
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>