“需要领域迁移”,从领域数据库中检索值时出现异常
Posted
技术标签:
【中文标题】“需要领域迁移”,从领域数据库中检索值时出现异常【英文标题】:"realm migration needed", exception in android while retrieving values from realm db 【发布时间】:2016-02-29 15:26:36 【问题描述】:我在我的应用程序中使用 Realm 作为后端。我创建了一个名为 Setting 的表。我按照 Realm 官方网站上给出的步骤在该表中添加了值。 但是当我要从该表中检索值时,我得到了异常
“io.realm.exceptions.RealmMigrationNeededException: RealmMigration must be provided”就行了:“realm=Realm.getInstance(getApplicationContext());”。
实际上,我是 android 和 Realm 的新手,所以很难理解是什么问题。
【问题讨论】:
【参考方案1】:编辑:对于新版本的 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();
【讨论】:
RealmConfiguration config = new RealmConfiguration.Builder(context).deleteRealmIfMigrationNeeded().build()
在我的领域版本 2.0.0 上。 Builder(Context context)
不公开
如果你想知道如何使用“config”,试试这个:realm.getInstance(config);
或者只是Realm.setDefaultConfiguration(config)
等等。
如果仍然无法正常工作,请尝试重新安装您的应用。为我工作
@EpicPandaForce 如果我们在同一个应用程序中有两个数据库要访问,那么如何设置一个设置默认配置,领域不总是只使用默认配置文件吗?请解释。如果我要使用多个数据库,我很难理解这个概念。【参考方案2】:
如果您将应用程序上传到商店,“删除并重新安装应用程序”对其他用户将不起作用,因此您必须使用“删除”领域和“重新安装”领域,而不是应用程序。方法就是这样,希望对你有帮助!!
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 谢谢哥们,这对解决问题很有帮助【参考方案3】:你改变了领域结构。
为了修复它,您应该包含migration 或者干脆删除应用程序并重新安装。
【讨论】:
是的,它成功了,我重新安装了应用程序...非常感谢哥们 如果您是新手,您可以通过“接受”来将此答案标记为“有效”。 (左侧有一个“v”标记) 我还想问一件事,因为我现在已经在“RealmResults”中检索了值。我的表中有属性为“id、name、values”。如何分别获取“值”列的值..”??? 您只能获取整个对象,因此您可以执行 FindAll() 并循环 .getValues() 部分 实际上它没有显示getValues()的选项,但我确实get(i);但它提供了整行,我想要该行中的单个值。我的代码是“settingDataList.get(0);”【参考方案4】:这对我有用
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】:Kotlin 版本:
val realm = try
Realm.init(this)
val config = RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded()
.build()
Realm.getInstance(config)
catch (ex: RealmMigrationNeededException)
Realm.getDefaultInstance()
【讨论】:
以上是关于“需要领域迁移”,从领域数据库中检索值时出现异常的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 Access 数据库中搜索时出现 C#OleDb 异常“没有为一个或多个必需参数提供值”[关闭]
尝试从 Apache Beam 中的选项获取值时出现空指针异常