2014-05-18 2 views
1

У меня есть массив строк, мне нужно сохранить этот массив с помощью SharedPreferences, а затем прочитать и отобразить их в ListView.Как сохранить массив строк с SharedPreferences?

На данный момент, я использую этот алгоритм:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

//To save the strings 
public void saveStrings(String[] str){ 
    int a = 0; 
    int lenght = str.length; 
    while (a<lenght){ 
     sp.edit().putString(Integer.toString(a), Integer.toString(str[a])).apply(); 
     a=a+1; 
    } 
} 

//To read the strings 
public String[] getStrings(){ 
    String[] str = new String [8]; 
    int a = 0; 
    int lenght = 8; //To read 8 strings 
    while (a<lenght){ 
     str[a] = sp.getString(Integer.toString(a),"Null"); 
     a=a+1; 
    } 
return str; 
} 

Есть ли способ сохранить и прочитать весь массив, а не строку в то время?

Для этого проекта я использую уровень API 19 (Android 4.4.2 KitKat)

+0

Посмотрите на этот вопрос: http://stackoverflow.com/questions/4064901/how-to-use-sharedpreferences-as-localstore-in-more-generic-way –

+0

Использование GSON. Вот ваше решение: - http://stackoverflow.com/a/20848025/1787135 – jpardogo

ответ

2

Ну, вы могли бы использовать putStringSet(), но (а) это только с уровня API 11 и далее (b), как сказано в его названии, для устанавливает (это означает, что вы потеряете исходный порядок и любые дубликаты, присутствующие в массиве).

Мы решили эту проблему путем «кодирование» коллекция в строку и с помощью putString() и декодирование их потом на getString(), с этой парой методов (для ArrayList, но они должны быть легко конвертированы в версии массива):

public String encodeStringList(List<String> list, char separator) 
{ 
    StringBuilder sb = new StringBuilder(list.size() * 50); 

    for (String item : list) 
    { 
     if (sb.length() != 0) 
      sb.append(separator); 

     // Escape the separator character. 
     sb.append(item.replace(Character.toString(separator), "\\" + separator)); 
    } 

    return sb.toString(); 
} 

public List<String> decodeStringList(String encoded, char separator) 
{ 
    ArrayList<String> items = new ArrayList<String>(); 

    if (encoded != null && encoded.length() != 0) 
    { 
     // Use negative look-behind with backslash, because it's used for escaping the separator. 
     // Expression is "(?<!\)s" with doubling because of escaping in regex, and again because of escaping in Java). 
     String splitter = "(?<!\\\\)" + separator; //$NON-NLS-1$ 
     String[] parts = encoded.split(splitter); 

     // While converting to list, take out the escape characters used to escape the now-removed separator. 
     for (int i = 0; i < parts.length; i++) 
      items.add(parts[i].replace("\\" + separator, Character.toString(separator))); 
    } 

    return items; 
} 
+0

Спасибо за ваш ответ, но я понимаю, что не могу использовать этот метод, потому что у меня много дубликатов, и Я не могу потерять дубликаты! – FirestormXYZ

+0

@ Salvuccio96 В случае, если я не был ясен, этот метод сохраняет дубликаты, просто вызовите putString(). Я предупреждал о putStringSet(). – matiash

+0

Извините, я не читал это правильно! – FirestormXYZ

0

Set<String> set =list.getStringSet("key", null); Set<String> set = new HashSet<String>(); set.addAll(list of the string list u have); editor.putStringSet("key", set); editor.commit();
Пожалуйста, обратитесь к этой теме для получения более подробной информации Save ArrayList to SharedPreferences

0
//while storing 
str is string array 
String fin=""; 
for(i=0;i<n;i++){ 
    fin=fin+str[i]+","; 
} 
fin=fin.substring(0,fin.length()-1); 

//while retrieving 
List<String> items = Arrays.asList(fin.split("\\s*,\\s*")); 
+0

функция split здесь увидит для пробелов ноль или больше, чем буквальную запятую, а затем снова пробегает нуль или больше. –

Смежные вопросы