Почему SharedPreferences не поддерживает списки строк?

Почему у SharedPreferences.Editor есть метод putStringSet(), но нет метода putStringList()? Это не имеет для меня никакого смысла. Насколько я понимаю (что может быть неправильно), объекты SharedPreferences хранятся внутри с использованием xml, а xml поддерживает массивы.

Я понимаю, что объект SharedPreference предназначен быть простым объектом для небольших объемов данных, поэтому вам не хотелось бы иметь слишком много методов put, но я бы подумал, что если вы собираетесь иметь один из putStringSet() или putStringList(), putStringList() было бы более полезно (множество можно сохранить как список, но не наоборот) и проще в реализации. Кто-нибудь может это объяснить?


person Paul Boddington    schedule 14.09.2015    source источник
comment
проверьте это, чтобы помочь вам stackoverflow.com/questions/7057845/   -  person Pavan    schedule 14.09.2015
comment
@Pavan ОП спрашивает, ПОЧЕМУ поддерживается putStringSet, но не putStringList, а не о том, как это сделать. Я предполагаю, что это как-то связано с тем фактом, что наборы - это неупорядоченные коллекции, в отличие от списков; интересный вопрос, надеюсь, кто-то может уточнить   -  person rcbevans    schedule 14.09.2015
comment
@Pavan Эта ссылка содержит несколько обходных путей (например, преобразование в строку Json, использование putString(key + index, strings.get(index); или использование символа разделения, такого как string0 + '#' + string1 + '#' + string2 и т. д.). Я использовал эти хаки, но я хотел бы знать, почему это было разработано таким образом. Для меня это вообще не имеет смысла.   -  person Paul Boddington    schedule 14.09.2015
comment
Я голосую за то, чтобы закрыть это как основанное на мнении. Единственные люди, которые могут однозначно ответить, зачем это SharedPreferences, это разработчики, ответственные за SharedPreferences, и вряд ли они увидят этот вопрос, не говоря уже о том, чтобы ответить на него.   -  person CommonsWare    schedule 14.09.2015
comment
@CommonsWare Достаточно честно. Этот сайт демократичен, но я не думаю, что он основан на мнении. Должна быть техническая причина, почему наборы строк легче сохранить, чем списки строк. Я хотел бы знать, что это за причина.   -  person Paul Boddington    schedule 14.09.2015
comment
Должна быть техническая причина, по которой наборы строк легче сохранить, чем списки строк — кто сказал, что это проще? Тот факт, что они решили сделать X, не означает, что X каким-то образом проще, чем Y. Мы не знаем, почему они выбрали X, и догадки о причине (например, им нужен API с большей гибкостью в отношении реализации хранилища) являются просто мнениями.   -  person CommonsWare    schedule 14.09.2015
comment
@CommonsWare Проблема в том, что, похоже, вам нужно кое-что знать о деталях реализации, чтобы иметь возможность правильно использовать класс. Кажется, существуют ограничения на символы (например, такие вопросы, как stackoverflow.com/ вопросы/32530733/). Я могу ошибаться в том, что здесь есть ограничения, но я знаю, что такие вопросы почти никогда не получают удовлетворительного ответа на SO. Документация по Android (в отличие от документации по Java) редко содержит полезную информацию или полезные советы по обходным путям.   -  person Paul Boddington    schedule 14.09.2015
comment
Я не утверждаю, что документы отстой. Как вы думаете, почему в моей книге 3300+ страниц? :-) Однако тот факт, что документы отстой, как-то не делает, почему разработчики FOO реализовали BAR как BAZ вместо GOO? как-то уместно для этого сайта. Stack Overflow предназначен для вопросов, на которые можно достаточно авторитетно ответить, и почему они это сделали? вопросы редко могут.   -  person CommonsWare    schedule 14.09.2015
comment
@CommonsWare Я думаю, мне нужно взглянуть на вашу книгу, но похоже, что сначала мне придется укрепить свои полки.   -  person Paul Boddington    schedule 14.09.2015
comment
Это цифровое. Только не распечатывайте его, а если будете, не забывайте поднимать коленями, а не спиной. :-)   -  person CommonsWare    schedule 14.09.2015


Ответы (1)


Я не являюсь разработчиком исходного кода, но если подумать, хранилище KV, которым является SharedPreferences, довольно простое. Итак, у вас есть putString() и вы поместили StringSet(). Использование вариантов StringSet для сохранения нескольких строк не накладывает ограничений на фактическое решение для хранения. т. е. если бы вместо файла XML это была sqlite db, вы могли бы запросить таблицу для всех значений с ключом и этим типом. Каким бы образом движок sql ни заказал их, они будут приняты как есть. Однако, если бы вам нужно было поддерживать порядок, необходимо было бы ввести новую структуру, которая будет накладываться на все другие типы данных, например, столбец порядка. Даже в XML это потребовало бы больше памяти и большей сложности, чтобы обозначить, что один упорядочен, а другой нет.

Мне кажется, что пока SharedPreferences поддерживает putString и putStringSet, вы можете получить как упорядоченное, так и неупорядоченное хранилище.

i.e.

String orderedString = TextUtils.join(mySafeDeliminator, myListOfStrings);
preferences.edit().putString("key", orderedString).apply();

....
String orderedReturnedString = preferences.getString("key");
List<String> listOfStrings = Arrays.asList(TextUtils.split(orderedReturnedString, mySafeDeliminator));
person Greg Giacovelli    schedule 14.09.2015