Realmをアプリケーションのバックエンドとして使用しています。 Settingという名前のテーブルを1つ作成しました。 Realmの公式サイトに記載されている手順に従って、そのテーブルに値を追加しました。しかし、そのテーブルから値を取得しようとすると、例外が発生します
「io.realm.exceptions.RealmMigrationNeededException:RealmMigrationを提供する必要があります」行:「realm = Realm.getInstance(getApplicationContext());」。
実際、私はAndroidとRealmが初めてなので、問題を理解するためのトラブルを見つけています。
編集:Realmの新しいバージョンでは、Realm.init(Context context)が追加されます
Realm.init(context);
RealmConfiguration config = new RealmConfiguration
.Builder()
.deleteRealmIfMigrationNeeded()
.build();
注:この構成オプションを使用すると、スキーマを変更すると、データが失われます、具体的には:
@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 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();
レルム構造に何かを変更しました。
これを修正するには、 migration を含めるか、単にアプリケーションを削除して再インストールする必要があります。
それは私のために働く
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);
}