屏幕旋转导致顺序调用 SQLite 出现问题

Screen rotation causes trouble with secuential calls to SQLite

如果您是一位经验丰富的 Android 程序员,您可能知道屏幕方向会导致通过 onSaveInstanceState() 和 onRestoreInstanceState 保存和恢复应用程序。

你可能也知道通过这些特性不容易恢复对象,例如,如果我创建一个数据库连接如下:

SQLiteDatabase mydb = openOrCreateDatabase(dbn.trim().toLowerCase(), 0, null);

然后我执行一个加载记录的查询,如下所示:

Cursor rs = mydb.rawQuery("SELECT * FROM MY_TABLE where id>0", null);

之后我可以通过使用读取下一条匹配记录:

rs.moveToNext();

现在有个半坏消息...如果在我刚才解释的对 SQLite 的连续调用期间,用户倾斜设备,所有内容都被删除然后恢复,除了包含结果集的 Cursor 之类的对象.所以,即使是 SQLite 连接也会被重置!

现在,我知道可以在此类任务期间锁定屏幕方向,无论我们是通过编程方式还是通过 Android 清单来实现。所以,没问题。

现在,坏消息是...当您使用 startActivityForResult() 调用 Intent 时,您无法控制所调用功能的屏幕方向!因此,即使您专门将应用程序配置为锁定方向,主机应用程序也会旋转。而且似乎没有直观的解决方法。

这会导致从空指针到各种崩溃的一系列问题。

我无法控制用户何时完成后续的 SQLite 调用,或者用户何时调用 startActivityForResult(),有没有办法避免这一切?我在想是否有一种方法可以通过编程锁定整个设备的屏幕旋转....

您可以覆盖配置更改,以便应用程序不会在屏幕旋转期间关闭。在您的清单部分,输入

android:configChanges="orientation|screenSize" >

当方向或屏幕尺寸发生变化时,这将在您的应用中调用 Activity.onConfigurationChanged(),而不是重新启动它。

在我的应用程序中,我所做的就是这个(技术上不需要):

@Override public boolean onConfigurationChanged (Configuration newConfig)
{
  super.onConfigurationChanged (newConfig);
}

我不需要添加任何代码来刷新视图 - 它们会自动失效并重新生成。

详情请见 http://developer.android.com/guide/topics/resources/runtime-changes.html