2012-01-29 1 views
10

Я разрабатываю приложение для словарей. В моем приложении я предполагаю, что пользователь хочет сохранить любимые слова. Я решил использовать SharedPreferences, чтобы сохранить эти значения (я знаю, что SQLite и файлы лучше, но я придерживаюсь «SharedPreferences», поэтому продолжайте с этим).Как использовать SharedPreferences для сохранения нескольких значений?

Здесь ниже мой код:

@Override 
public void onClick(View v) {          
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    { 
     SharedPreferences.Editor editor = faves.edit(); 
     editor.putString("favourite", mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
     editor.commit();  
    } 
    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

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

Итак, как можно изменить приведенный выше код, чтобы эта проблема была решена?

Можете ли вы, ребята, помочь? Большое спасибо.

ответ

17

Вы можете сохранить несколько избранных в одиночку, добавив множество избранных в одну строку, каждый любимый элемент, разделенный запятой. Затем вы можете использовать метод convertStringToArray для преобразования его в String Array. Вот полный исходный код.
Использование методов MyUtility для сохранения нескольких любимых предметов.

  MyUtility.addFavoriteItem(this, "Sports"); 
      MyUtility.addFavoriteItem(this, "Entertainment"); 

получить строковый массив из всех фаворитов сохранен

String[] favorites = MyUtility.getFavoriteList(this);// returns {"Sports","Entertainment"}; 

Сохраните эти методы в отдельных утилитах класса

public abstract class MyUtility { 

    public static boolean addFavoriteItem(Activity activity,String favoriteItem){ 
     //Get previous favorite items 
     String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
     // Append new Favorite item 
     if(favoriteList!=null){ 
      favoriteList = favoriteList+","+favoriteItem; 
     }else{ 
      favoriteList = favoriteItem; 
     } 
     // Save in Shared Preferences 
     return putStringInPreferences(activity,favoriteList,"favorites"); 
    } 
    public static String[] getFavoriteList(Activity activity){ 
     String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
     return convertStringToArray(favoriteList); 
    } 
    private static boolean putStringInPreferences(Activity activity,String nick,String key){ 
     SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, nick); 
     editor.commit();       
     return true;   
    } 
    private static String getStringFromPreferences(Activity activity,String defaultValue,String key){ 
     SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
     String temp = sharedPreferences.getString(key, defaultValue); 
     return temp;   
    } 

    private static String[] convertStringToArray(String str){ 
     String[] arr = str.split(","); 
     return arr; 
    } 
} 

Если вы должны добавить дополнительные избранное. Затем получите любимую строку от SharedPreference и добавьте запятую + любимый элемент и сохраните его обратно в SharedPreference.
* Вы можете использовать любую другую строку для разделителя вместо запятой.

+0

Большое спасибо. Но я еще не понимаю, что делать с программным обеспечением. Вот строковая форма SharedPreferences: ' dict_name :: 149272 :: go,'. Где должен быть размещен ваш код? –

+0

@ user998032 Я добавил код, чтобы объяснить, как мы можем добавить несколько любимых предметов. Вы можете использовать код как есть, он будет работать для вас. –

+0

@@ Muhammad Nabeel Arif: Большое спасибо, но все равно не повезло, извините! Я хочу, чтобы фаворит был сохранен после onClick, но многие ошибки возникли после вышеупомянутого отредактированного кода. –

7

SharedPreferences работать через простой ключ/значение, поэтому, когда вы предоставляете новое значение для того же ключа, предыдущее значение перезаписывается. Единственный способ сделать то, что вы пытаетесь сделать, это использовать разные ключи, какие намеки на то, что вы, вероятно, не должны использовать SharedPreferences за то, что вы пытаетесь сделать.

5

Honeycomb добавлен метод putStringSet, так что вы могли бы использовать, что если вы не должны поддерживать что-либо меньшее, чем Honeycomb:

@Override 
public void onClick(View v) { 
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    { 
     Set<String> faveSet = faves.getStringSet("favourite"); 
     faveSet.add(mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
     SharedPreferences.Editor editor = faves.edit(); 
     editor.putStringSet("favourite", faveSet); 
     editor.commit(); 
    } 
    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

Если вам нужна поддержка для предварительного Honeycomb устройств, вы должны прийти с вашей собственной схемой.

Одной из возможностей является сохранение слов в виде значений, разделенных запятыми, в одном предпочтении.

Другим является создание нового ключа для каждого нового слова: «favourite1», «favourite2», «favourite3» и другое предпочтение, которое вы используете для хранения количества слов.

+0

Это правда, но, к сожалению, я делаю вещи для устройств с предварительной сотой. Большое спасибо. –

2

Каждый раз, когда вы нажимаете кнопку, вы сохраняете любимое слово с уже существующей клавишей: favorite, и вы переопределяете его. Чтобы сохранить несколько слов, вам нужно сохранить слова с помощью разных клавиш. Таким образом, каждый раз, когда вы сохраните любимое слово, которое вы могли бы сделать:

private static int incrementedValue = 0; 
... 
@Override 
public void onClick(View v) { 
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    SharedPreferences.Editor editor = faves.edit(); 
    editor.putString("favourite" + incrementedValue, mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
    editor.commit(); 

    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
    incrementedValue++; 
} 
+0

спасибо. Мне нравится ваш подход, но когда он применяется, он создает ошибки с ** incrementedValue **, говоря, что VariableDeclarationId ожидается после ... –

+0

@ user998032 Я отредактировал свой ответ, я забыл добавить 'int' в объявление переменной incrementedValue (не забудьте добавить первую строку, объявление переменной, в свой класс с помощью метода onClick()). – Luksprog

+0

Спасибо большое, slukian! Это работает, но не так, как я ожидал. SharePreferences теперь сохраняет строки как: ' dict_name :: 157562 :: heap up, dict_name :: 31377 :: bell, dict_name :: 349333 :: tell, dict_name :: 349333 :: tell, dict_name :: 11834 :: am,', но для просмотра загружено только первое любимое слово («favourite0»). –

1

Ну это потому, что фактическое хранение предпочтение не список строк, только один один, так что всякий раз, когда вы говорите putString() вы перезаписать предыдущее значение. Хорошим способом хранения нескольких объектов в одной строке предпочтений является использование JSON. Просто сериализуйте значение, а затем напишите ему. Он также имеет преимущество преобразования непосредственно обратно в объект любой сложности, какой вы пожелаете. Посмотрите на использование Jackson, если вы решите пойти по этому маршруту.

1

Вы можете использовать TreeMap (или другой тип списка, который реализует Serializable). Вот как я недавно обработал список избранных. В TreeMap, Favorite - это класс, который я использую. В вашем случае вы можете просто использовать TreeMap < Integer, String>.

private static TreeMap<Integer, Favourite> favourites; 

... 
... 
... 

// load favourites 
FileInputStream fis=null; 
ObjectInputStream ois = null; 
try { 
    fis = context.openFileInput(context.getString(R.string.favourites_file)); 
    try { 
    ois = new ObjectInputStream(fis); 
    favourites = (TreeMap<Integer, Favourite>) ois.readObject(); 
    } catch (StreamCorruptedException e) { 
    } catch (IOException e) { 
    } catch (ClassNotFoundException e) { 
    } 
} catch (FileNotFoundException e) { 
} finally { 
    try { 
    if (ois!=null){ 
     ois.close(); 
    } 
    } catch (IOException e) { 
    }  
} 

if (favourites==null){ 
    favourites = new TreeMap<Integer, Favourite>();  
} 

... 
... 
... 

// save favourites 
FileOutputStream fos=null; 
ObjectOutputStream oos=null; 
try { 
    fos = context.openFileOutput(context.getString(R.string.favourites_file), MODE_PRIVATE); 
    try { 
    oos = new ObjectOutputStream(fos); 
    oos.writeObject(favourites); 
    } catch (IOException e) { 
    } 
} catch (FileNotFoundException e) { 
} finally { 
    if (oos!=null){ 
    try { 
     oos.close(); 
    } catch (Exception e2) { 

    } 
    }  
} 

Вы также можете избежать использования «::», которое вы делаете для разделения значений.

Надеюсь, что это поможет ...

+0

Большое спасибо. Я попробовал подобное раньше, но получил проблему, когда перечислены фавориты. –