屏幕旋转会导致SQLite的调用问题

时间:2015-05-13 21:28:55

标签: android sqlite rotation restore

如果您是经验丰富的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的一个secuential调用中,用户倾斜设备,一切都被删除然后恢复,除了包含结果集的Cursor之类的对象。所以,即使SQLite连接也会被重置!

现在,我知道可以在这些任务中锁定屏幕方向,无论是以编程方式还是通过Android Manifest。所以,没问题。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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