web-dev-qa-db-fra.com

Obtention de l'erreur "Impossible de résoudre la méthode" lors de la tentative d'implémentation de getSharedPreferences dans Android Studio

J'essaie de créer une classe KeyValueDB qui stocke des méthodes pour interagir avec SharedPreferences, mais je rencontre un problème juste en définissant la classe. Tout ce que je veux que le constructeur fasse, c'est stocker un objet sharedPreferences avec le nom de fichier correct, mais j'obtiens une "méthode impossible à résoudre 'getSharedPreferences (Java.lang.String, int)'

Je passe une chaîne et un int ... Je ne suis pas sûr de ce que je fais mal. Appréciez toute aide!

package com.farmsoft.lunchguru.utils;

import Android.content.Context;
import Android.content.SharedPreferences;

import Java.util.ArrayList;
import Java.util.List;
import Java.util.Map;

import org.json.JSONException;

/**
 * Created by sxs on 4/28/2014.
 */
public class KeyValueDB {
    private SharedPreferences sharedPreferences;

    public KeyValueDB(String prefName) {
        sharedPreferences = getSharedPreferences(prefName, Context.MODE_PRIVATE);
    }
12
Scott

getSharedPreferences () a besoin d'un contexte pour être accédé.

Par exemple:

mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);

Vous devez soit passer le contexte dans le constructeur pour KeyValueDB, ou une meilleure façon serait d'y accéder statiquement.

Je ferais ça

public class KeyValueDB {
private SharedPreferences sharedPreferences;
private static String PREF_NAME = "prefs";

    public KeyValueDB() {
    // Blank
    }

    private static SharedPreferences getPrefs(Context context) {
        return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }

    public static String getUsername(Context context) {
        return getPrefs(context).getString("username_key", "default_username");
    }

    public static void setUsername(Context context, String input) {
        SharedPreferences.Editor editor = getPrefs(context).edit();
    editor.putString("username_key", input);
    editor.commit();
    }
}

Répétez simplement ces méthodes get et set pour toutes les informations que vous devez stocker.

Pour y accéder depuis une activité, vous devez procéder comme suit:

String username = KeyValueDB.getUsername(this);

Où "ceci" est une référence à l'activité. Il est également recommandé de configurer un contexte dans chaque activité dans la méthode onCreate (), comme:

public class myActivity extends Activity{

Context mContext;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = this;

    String username = KeyValueDB.getUsername(mContext);
}

EDIT juillet 2016

en réponse à @RishirajPurohit ci-dessous, pour définir un nom d'utilisateur, vous faites à peu près la même chose:

KeyValueDB.setUsername(mContext, "DesiredUsername");

À partir de là, tout est fait pour vous dans la classe statique précédente, la modification est validée dans le fichier de préférences partagées et persistante et prête à être récupérée par la méthode get.

Juste une note sur la méthode get, au cas où quelqu'un se demanderait:

public static String getUsername(Context context) {
    return getPrefs(context).getString("username_key", "default_username");
}

"default_username" est exactement comme il sonne. Si cette méthode get est appelée en premier avant qu'un nom d'utilisateur ne soit défini, c'est la valeur qui est retournée. Moins utile dans ce cas, mais lorsque vous commencez à utiliser des entiers et des valeurs booléennes, cela est très utile pour garantir la robustesse.

36
MattBoothDev

Vous devez y passer un contexte ...

exemple d'obtention d'une valeur de chaîne:

public static String getUserName(Context ctx)
{
    return getSharedPreferences(ctx).getString(PREF_USER_NAME, "");
}

PREF_USER_NAME est la clé et le deuxième paramètre est lorsqu'il ne trouve pas la clé qu'il renvoie ""

1
Rod_Algonquin