2014-04-28 19 views
6

Próbuję utworzyć klasę KeyValueDB, która przechowuje metody interakcji z SharedPreferences, jednak napotykam problem polegający właśnie na zdefiniowaniu klasy. Wszystko, co chcę, aby konstruktor robił, to przechowywanie obiektu sharedPreferences z poprawną nazwą pliku, ale otrzymuję metodę "nie można rozwiązać" getSharedPreferences (java.lang.String, int) "Błąd "nie można rozwiązać metody" podczas próby implementacji getSharedPreferences w Android Studio

Przekazuję ciąg i . int ... nie jestem pewien, co robię źle wdzięczni za każdą pomoc

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); 
    } 
+0

Potrzebujesz obiektu Context dla instancji SharedPreferences: http://developer.android.com/reference/android/content/Context.html#getSharedPreferences%28java.lang.String,%20int%29 – Benjamin

Odpowiedz

30

getSharedPreferences() potrzebuje kontekstu, do którego można uzyskać dostęp.

Na przykład:

mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); 

Trzeba też zdać kontekst do konstruktora dla KeyValueDB lub lepszym sposobem byłoby aby uzyskać dostęp do statycznie.

zrobiłbym to

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(); 
    } 
} 

Wystarczy powtórzyć te metody get i set dla wszelkich informacji potrzebnych do przechowywania.

Aby uzyskać do nich dostęp z działalności, by to zrobić:

String username = KeyValueDB.getUsername(this); 

gdzie "to" jest odniesieniem do działania. Jest to również dobra praktyka, aby skonfigurować kontekst, w każdej działalności w sposób onCreate(), takich jak:

public class myActivity extends Activity{ 

Context mContext; 

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

    String username = KeyValueDB.getUsername(mContext); 
} 

EDIT lipca 2016

w odpowiedzi na @RishirajPurohit poniżej, aby ustawić nazwę użytkownika robisz bardzo dużo samo:

KeyValueDB.setUsername(mContext, "DesiredUsername"); 

Stamtąd wszystko odbywa się dla Ciebie w poprzedniej klasie statycznej, zmiana jest zobowiązana do pliku udostępnionego preferencji i utrzymywały i gotowy do być pobierane metodą gET.

Tylko uwaga na metody GET, w przypadku gdy ktoś zastanawia się:

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

"default_username" jest dokładnie tak, jak to brzmi. Jeśli ta metoda get jest wywoływana jako pierwsza przed ustawieniem nazwy użytkownika, jest to zwracana wartość. Mniej przydatne w tym przypadku, ale gdy zaczniesz używać liczb całkowitych i wartości boolowskich, jest to bardzo przydatne dla zapewnienia niezawodności.

+0

Dzięki!To była wspaniała wyczerpująca odpowiedź. – Scott

+0

@ Kryten2k35 Twoja odpowiedź była czysta i bardzo pomocna. Dziękuję Ci. –

+0

i kiedy chcę ustawić user_user? to samo jak uzyskać prawo? –

1

należy zdać jakiś kontekst ...

przykładem coraz wartość ciągu:

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

gdzie PREF_USER_NAME jest kluczem, a drugim parametrem jest, gdy nie może znaleźć klucza, który zwraca ""

Powiązane problemy