Грешка при запазване с помощта на SharedPreferences

Запазвам няколко променливи с помощта на sharedpreferences, но моят метод за запазване срива приложението с изключение на нулев указател.

public void save() {

    SharedPreferences sp = context.getSharedPreferences(saveFile, Context.MODE_PRIVATE);
    //Use the editor for easier management, no calling edit and commit so many times. 
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
    editor.commit();
}

getSharedPreferences() не работи сам и трябва да има контекст. преди него, което може да е проблем. Имам дефиниран контекст, импортирани SharedPreferences, така че защо това не работи?

РЕДАКТИРАНЕ: Ето логката

02-18 20:21:49.958: E/AndroidRuntime(1005): FATAL EXCEPTION: Thread-89
02-18 20:21:49.958: E/AndroidRuntime(1005): java.lang.NullPointerException
02-18 20:21:49.958: E/AndroidRuntime(1005): at com.package.game.GameScreen.save(GameScreen.java:856)
02-18 20:21:49.958: E/AndroidRuntime(1005): at com.package.game.GameScreen.updateLevelUp(GameScreen.java:364)

Методът за запазване е по-горе и редът:

SharedPreferences sp = context.getSharedPreferences(saveFile, Context.MODE_PRIVATE);

е ред 856. updateLevelUp е методът, който се извиква, когато играчът се изравни и когато този екран излезе, играта се възобновява и се извиква save().


person user2005938    schedule 18.02.2013    source източник
comment

Опитайте се да използвате разделител (сепаратор) поне като [div1 content]~[div2 content]~[div3 content], ако не можете да добавите три различни колони.

В javascript можете да използвате функцията split, за да получите съдържанието на три раздела поотделно сега.

Ако искате да използвате като разделител, тогава

var div1Content = myContent.split("<div")[0];
var div2Content = "<div" + myContent.split("<div")[1];
var div3Content = "<div" + myContent.split("<div")[2];
  -  person Raghav Sood    schedule 18.02.2013
comment
Помислете за запазване на препратка към safeFile.edit() и извикване на commit() веднъж.   -  person Sam    schedule 18.02.2013
comment
loadSave логично изглежда е нула   -  person EvZ    schedule 18.02.2013
comment
@EvZ Може да бъде context, players, може би дори една от върнатите стойности.   -  person Sam    schedule 18.02.2013
comment
@Sam вярно, беше бърз отговор.   -  person EvZ    schedule 18.02.2013
comment
Вторият ред е нулев и loadSave се дефинира като публичен статичен финален низ loadSave = gameSave;   -  person user2005938    schedule 18.02.2013


Отговори (2)


Вашата променлива context е null. Уверете се, че е инициализиран и че не извиквате този код преди onCreate() на съответното Context.

person Raghav Sood    schedule 18.02.2013
comment
Съжалявам, но на какво да го настроя? - person user2005938; 19.02.2013
comment
@user2005938 Задайте го на контекста на вашата дейност или приложение. Или дори по-добре, използвайте getApplicationContext() директно на негово място - person Raghav Sood; 19.02.2013
comment
Как да го настроя на контекст на приложението? getApplicationContext() не работи за мен. - person user2005938; 19.02.2013
comment
Така или иначе бихте го задали с помощта на context = getApplicationContext(). Какво искаш да кажеш с това, че не работи за теб? Къде се обаждате на този код? - person Raghav Sood; 19.02.2013
comment
Когато правя Context context = getApplicationContext(); казва, че методът getApplicationContext е недефиниран. - person user2005938; 19.02.2013
comment
В кой клас е този код? Дали това е дейност или услуга или приемник за излъчване? - person Raghav Sood; 19.02.2013

Като добро правило искате да използвате SharedPreferences.Editor, когато управлявате SharedPreferences.

Ето по-прост начин:

public void save() {
    SharedPreferences saveFile = context.getSharedPreferences(loadSave, Context.MODE_PRIVATE);
    //Use the editor for easier management, no calling edit and commit so many times. 
    SharedPreferences.Editor editor = saveFile.edit();

    editor.putInt("x", player.get());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());

    //Save changes now
    editor.commit();
}

Също така, в случай че все още получавате нулев указател след тази реализация, уверете се, че публикувате регистрационния файл, за да можем да проследим изключението.

person daniel_c05    schedule 18.02.2013
comment
Това е добър съвет, но не мисля, че трябва да промени нещо. - person A--C; 18.02.2013
comment
Първо, той не е публикувал дневника, което означава, че дори не знаем със сигурност какъв е проблемът. На пръв поглед единственото нещо, което намирам за проблематично, е извикването на edit() и commit () няколко пъти, най-вече извикването на commit() би било често срещана причина за проблеми. - person daniel_c05; 18.02.2013