2015-05-13 1 views
3

Если вы опытный Android-программист, вероятно, знаете, что ориентация экрана вызывает сохранение и восстановление приложения через onSaveInstanceState() и onRestoreInstanceState.Вращение экрана вызывает проблемы с секретными вызовами SQLite

вы, вероятно, также известно, что объекты не легко восстановить с помощью этих функций, например, если я создать соединение с базой данных следующим образом:

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

И тогда я выполнить запрос для загрузки записи в качестве следующим образом:

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

После этого я могу прочитать следующую соответствующую запись только с помощью:

rs.moveToNext(); 

Теперь приходят полуплохие новости ... если во время секретного вызова SQLite, как я только что объяснил, пользователь наклоняет устройство, все удаляется и затем восстанавливается, за исключением объектов, таких как курсор, содержащий результирующий набор. Таким образом, даже соединение SQLite сбрасывается!

Теперь я знаю, что во время таких задач можно заблокировать ориентацию экрана, независимо от того, делаем мы это программно или через манифест Android. Итак, не проблема.

Теперь, для плохих новостей ... Когда вы вызываете намерение, используя startActivityForResult(), вы не можете контролировать ориентацию экрана вызываемой функции! Таким образом, приложение-хост поворачивается, даже если вы специально настроили приложение для блокировки ориентации. И, похоже, для этого нет интуитивного решения.

Это вызывает ряд проблем от нулевых указателей до всех видов сбоев.

У меня нет контроля над тем, когда пользователь завершит вызов secuential SQLite или когда пользователь вызовет startActivityForResult(), есть ли способ избежать всего этого? Я думал, будет ли просто способ заблокировать вращение экрана всего устройства программно ....

+0

Вы можете не сохранить позиции, то используйте 'Cursor.moveToPosition (индекс)', когда вы обнаружили поворот экрана? – ChrisStillwell

+0

Поскольку индекс является целым, да, я могу сохранить позицию курсора. Но я не могу сохранить сам курсор, потому что это не сериализуемый Object. То же самое касается самого подключения к базе данных. База данных, которую я могу просто повторно открыть, но для курсора, мне нужно будет переиздать запрос, и это может быть ресурсоемким. – Brian

+0

Ах, правда, я, хотя вы снова открывали базу данных. Тогда почему бы не использовать [ContentQueryMap] (http://developer.android.com/reference/android/content/ContentQueryMap.html)? Он может сохранить курсор. – ChrisStillwell

ответ

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

+0

Отлично. Оно работает. Я все еще думаю, что перезапуск приложения таким образом является немым поведением. ОС должна иметь возможность делать это автоматически, а не делать это уродливо. Спасибо Пери. :) – Brian