web-dev-qa-db-ja.com

「レルムの移行が必要」、レルムデータベースから値を取得中にAndroidの例外

Realmをアプリケーションのバックエンドとして使用しています。 Settingという名前のテーブルを1つ作成しました。 Realmの公式サイトに記載されている手順に従って、そのテーブルに値を追加しました。しかし、そのテーブルから値を取得しようとすると、例外が発生します

「io.realm.exceptions.RealmMigrationNeededException:RealmMigrationを提供する必要があります」行:「realm = Realm.getInstance(getApplicationContext());」。

実際、私はAndroidとRealmが初めてなので、問題を理解するためのトラブルを見つけています。

39
Sanket Ranaware

編集: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();
74
1911z

ストアにアプリをアップロードすると、「アプリの削除と再インストール」は他のユーザーには機能しないため、アプリではなくレルムを「削除」し、レルムを「再インストール」する必要があります。ここにそれを行う方法があります、それが役立つことを願っています!!

    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.
        }
    }

[〜#〜] edit [〜#〜]

最新のレルム(3.0.0)では、レルムのコンストラクター構造が変更されているため、次のような操作を行う必要があります。

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

レルム構造に何かを変更しました。

これを修正するには、 migration を含めるか、単にアプリケーションを削除して再インストールする必要があります。

13
Lars Celie

それは私のために働く

    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
Cedriga