启动 Xamarin Forms Android 应用程序时未找到 RealmObject

Posted

技术标签:

【中文标题】启动 Xamarin Forms Android 应用程序时未找到 RealmObject【英文标题】:No RealmObject found when launching Xamarin Forms Android application 【发布时间】:2017-05-24 17:04:38 【问题描述】:

我有一个将 Realm 用于我们的移动数据库的 Xamarin Forms 应用程序,我们得到一个“System.InvalidOperationException:没有 RealmObjects。链接器是否已剥离它们?”仅在 android 上出现异常,并且仅当您在 Visual Studio 的调试会话之外打开应用程序时。

如果您使用调试器从 Visual Studio 启动应用程序,则应用程序可以正常工作并正确加载 Realm。如果您停止调试会话,然后在设备上重新打开应用程序,您将收到该异常并且应用程序崩溃。如果您只是从 Visual Studio 将应用程序发布到设备然后启动它,您也会看到该异常。 ios 工作正常,没有看到此错误。

我尝试过调试和发布版本,禁用链接,ProGuard 等...,从 Realm 1.2.1 更新到 1.4.0,但这些都不能解决问题。

我们的项目是结构化的,因此我们所有的 Realm 对象都位于一个单独的 .NET Standard 1.6 项目中,该项目被我们的平台特定项目引用。我们的平台项目和 Realm 模型项目中都安装了 Realm 1.4。

我使用 dotPeek 来反映 Realm 模型项目的输出 dll,以验证生成的 RealmModuleInitializer.Initialize() 方法是否将所有 36 个 RealmObjects 添加到 RealmSchema 类的默认类型列表中,因此编织步骤应该可以工作正确。

除了调试会话之外,我还有什么可以尝试在 Android 上运行的吗?

【问题讨论】:

您认为您可以隔离一个小型复制案例还是在 help@realm.io 私下分享您的整个项目? @Nikolarinchev 应用中有足够的敏感信息,我将无法分享。但我会看看我是否可以使用 .NET 标准库创建一个结构完全相同的演示项目,该库可以复制并传递它。 @Nikolarinchev 我弄清楚了导致此问题的具体原因。在我们的应用程序启动中,我们有一个链接器解决方法,我们在获取我们的 Realm 实例之前从我们的 Realm 项目中构造一个类的实例。当我将该实例更改为使用 Realm 项目中具有默认构造函数的类时,一切正常。所以它似乎与构建从没有自己的构造函数的 RealmObject 扩展的东西有关。 【参考方案1】:

这里有一些详细信息,以防其他人遇到此问题。

领域模式由定义领域对象的程序集中的模块初始化程序处理。模块初始化程序应该在第一次加载该模块中的任何代码时运行。由于我们已将所有 Realm 对象提取到他们自己的项目中,因此我们需要在创建 Realm 实例之前从该项目执行代码,否则将无法定义模式。但是,我们一直在运行的代码没有默认构造函数,因此它会退回到 RealmObject 构造函数中,这导致了问题。通过执行具有默认构造函数的代码,我们所有的问题都消失了。

【讨论】:

以上是关于启动 Xamarin Forms Android 应用程序时未找到 RealmObject的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Xamarin Forms 中启动 UWP 项目

张高兴的 Xamarin.Forms 开发笔记:Android 快捷方式 Shortcut 应用

Xamarin.Forms.Forms.Init(e) Onlaunched 中的 FileNotFoundExeception

Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机

Xamarin.Forms 是 Xamarin.Android、Xamarin.IoS 和 Xamarin.Win 的简单总和吗?

在 Xamarin.Forms 中使用 Android 绑定