我目前正在使用Monodroid / Xamarin开发跨平台应用程序。它使用SQLite.net数据库,目前我只构建了Android UI。
在应用程序中,后台线程上有一个长时间运行的方法,它执行多个数据库读写操作。
我正在运行Android 4.2.2的Nexus 7上测试这个长时间运行的方法,似乎在第二次屏幕旋转后,抛出了一个SQLite异常,应用程序崩溃了。
异常堆栈跟踪因旋转屏幕的时间而异,但异常始终是对象未设置为Prepare2内的实例。
有趣的是,在运行4.1.2的三星Galaxy S2上进行测试时,仍然会发生异常,但这是一个不同的例外。 此外,在三星Galaxy Tab 2和仿真器上进行测试时,根本没有抛出错误,方法也很好。
任何想法,提示和建议都会非常感激。
作为一个侧面问题 - 在我看过使用Xamarin的所有跨平台应用程序中 - 数据库层和/或存储库始终是静态的 - 这是什么原因?
谢谢大家
答案 0 :(得分:0)
很难从你所写的内容中找出问题 - 如果你在应用程序中包含一些关于如何访问数据库的代码,会更容易。
但是,我怀疑这里的问题是由于您的用户界面Activity
的生命周期与它与SQLite数据库交互的方式之间的某些交互。
默认情况下,当您旋转Activity
时,现有实例将被销毁并创建一个新实例 - 您的旧Activity将被调用以将其状态存储在SaveInstanceState
中并且新的轮换活动将在OnCreate
中使用捆绑进行调用。
这就是为什么数据库层在样本中通常是静态/单例的 - 这是允许多个活动/组件共享同一数据库实例的简单方法。
我猜测你的Activity在OnCreate
期间正在对数据库做些什么 - 并且在每次轮换/创建后调用它?或者也许你的长期运行方法试图在托管它的活动完成并处理后做一些事情?
答案 1 :(得分:0)
最后,结果证明这是一个多线程问题,Linq并没有很好地协同工作。感谢Stuart的回答。