Можно ли использовать PreferenceActivity с SQLite вместо res/xml?

Прелесть PreferenceActivity заключается в тесной интеграции с res/xml Android. Все, что вам нужно сделать, чтобы достичь волшебства самостоятельного чтения/сохранения предпочтений, вместе с пользовательским интерфейсом, это определить:

public class MyPreferenceActivity extends PreferenceActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);
  }
}

И определите любую структуру <PreferenceScreen>, которая вам нужна, в файле(ах) XML.

Но это также кажется его слабостью: он настолько тесно интегрирован, что я понятия не имею, можно ли использовать PreferenceActivity с SQLite (для более структурированного управления предпочтениями), без повторного изобретения в то время как (т. е. переписывание всей «PreferenceActivity» с нуля).

Например, использование OnSharedPreferenceChangeListener может предоставить доступ к использованию PreferenceActivity. с SQLite, но для этого по-прежнему требуются определения res/xml, поэтому на самом деле мы все еще ограничены ограничениями метода res/xml.

Есть ли способ «съесть торт и получить его тоже»? т.е. использовать PreferenceActivity с SQLite так же просто, как res/xml.


person uTubeFan    schedule 21.09.2011    source источник


Ответы (1)


Интересный вопрос.

Краткий ответ: насколько мне известно, вы не можете использовать SQLite с PreferenceActivity без значительной настройки, поскольку он не предназначен для работы таким образом.

Дело в том, зачем вам на самом деле нужен SQLite для управления настройками? SQLite, как правило, никогда не следует использовать для меньших данных, которыми можно управлять, не требуя реляционной структуры. Например, имеет смысл использовать SQLite, когда у вас есть несколько экземпляров похожих данных, таких как строки в таблице.

В случае Preferences я не могу представить себе такие случаи. Более того, SQLite бьет по производительности приложения по сравнению с SP. Делайте свой выбор с умом.

Обновление: если у вас есть несколько настроек, как в упомянутом выше вопросе, вы можете использовать комбинацию SQLite и SP. Заменить SP на SQLite точно нельзя. Что можно сделать, так это то, что вам нужно сохранить уникальный ключ, который станет первичным ключом таблицы, а затем в onPause PreferenceActivity вам нужно запустить запрос на вставку/обновление в таблице SQLite. Вы должны быть осторожны и следить за тем, чтобы отображались правильные SP, и, следовательно, в onResume of PreferenceActivity вам нужно иметь возможность запускать запрос на выборку с уникальным ключом и соответствующим образом устанавливать SP.

person PravinCG    schedule 21.09.2011
comment
Спасибо +1 за ваш ответ. Чтобы ответить на ваш вопрос, в своем OP я разместил ссылку на свой более ранний вопрос, который помог мне понять, что иерархическое наложение ключей невозможно с res/xml. Было предложено использовать SQLite. Я все еще борюсь с тем, как реализовать эту рекомендацию. - person uTubeFan; 21.09.2011
comment
Спасибо, другого вопроса не увидел. Я обновил свой ответ. - person PravinCG; 21.09.2011
comment
+1 еще раз за изложение решения. IIUC, ключ в том, чтобы синхронизировать SQLite с res/xml через onPause() и onResume(). Этот уникальный ключ может быть конкатенацией вложенных ключей в файле res/xml, который всегда был там, но по какой-то причине не может использоваться самим res/xml. Я приму этот ответ (если не появится еще лучший). Спасибо! - person uTubeFan; 21.09.2011
comment
Я думаю, я был не ясен. Уникальный ключ не будет никакой конкатенацией. Это будет происходить из какой-то другой активности, пока вы запускаете PreferenceActivity. Так, например, у вас есть 5 видео, и у каждого есть свои предпочтения. Затем, когда вы вызываете предпочтение, вам нужно передать идентификатор видео, и это будет первичный ключ в базе данных. Ключи для xml останутся прежними и не изменятся. - person PravinCG; 23.09.2011