Если вы опытный 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(), есть ли способ избежать всего этого? Я думал, будет ли просто способ заблокировать вращение экрана всего устройства программно ....
Вы можете не сохранить позиции, то используйте 'Cursor.moveToPosition (индекс)', когда вы обнаружили поворот экрана? – ChrisStillwell
Поскольку индекс является целым, да, я могу сохранить позицию курсора. Но я не могу сохранить сам курсор, потому что это не сериализуемый Object. То же самое касается самого подключения к базе данных. База данных, которую я могу просто повторно открыть, но для курсора, мне нужно будет переиздать запрос, и это может быть ресурсоемким. – Brian
Ах, правда, я, хотя вы снова открывали базу данных. Тогда почему бы не использовать [ContentQueryMap] (http://developer.android.com/reference/android/content/ContentQueryMap.html)? Он может сохранить курсор. – ChrisStillwell