0

我目前正在使用 Monodroid/Xamarin 开发跨平台应用程序。它使用 SQLite.net 数据库,目前我只构建了 Android UI。

在应用程序中,后台线程上有一个长时间运行的方法,该方法执行多次数据库读取和写入。

我在运行 android 4.2.2 的 Nexus 7 上测试了这种长时间运行的方法,似乎在第二次屏幕旋转之后,抛出了 SQLite 异常并且应用程序崩溃了。

异常堆栈跟踪因您旋转屏幕的时间而异,但异常始终是对象未设置为 Prepare2 内的实例。

有趣的是,在运行 4.1.2 的三星 Galaxy S2 上进行测试时,仍然会发生异常,但这是一个不同的异常。此外,在三星 Galaxy Tab 2 和模拟器上进行测试,根本不会抛出错误,并且该方法完成得很好。

任何想法,提示,建议将不胜感激。

作为一个附带问题 - 在我使用 Xamarin 看到的所有跨平台应用程序中 - 数据库层和/或存储库始终是静态的 - 这是什么原因?

感谢大家

4

2 回答 2

0

很难从您编写的内容中识别问题 - 如果您包含一些有关如何从应用程序访问数据库的代码,则会更容易。

但是,我怀疑这里的问题是由于 UI 的生命周期Activity和它与 SQLite 数据库交互的方式之间的一些交互。

默认情况下,当您旋转Activity 时Activity,现有实例将被销毁并创建一个新实例 - 您的旧 Activity 将被调用以将其状态存储在其中,SaveInstanceState而您的新旋转 Activity 将使用 中的捆绑包调用OnCreate

这就是为什么示例中的数据库层通常是静态/单一的——这是一种允许多个活动/组件共享同一个数据库实例的简单方法。

你的 Activity 正在对数据库做一些事情OnCreate- 并且在每次旋转/创建之后都会调用它?或者,您的长期运行方法可能是在托管它的 Activity 完成并处置后尝试做某事?

于 2013-05-24T07:17:08.420 回答
0

最后,这被证明是多线程和 Linq 不能很好地协同工作的问题。感谢斯图尔特的回答。

于 2013-06-14T00:42:36.047 回答