Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.95
Flash_2oo9
3 / 3 / 0
Регистрация: 31.10.2012
Сообщений: 142
#1

SharedPreferences - Программирование Android

20.08.2013, 02:38. Просмотров 3091. Ответов 7
Метки нет (Все метки)

Доброй ночи. Вышла заминка с бд класса SharedPreferences. Вообщем вот код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
 
public class StatisticsActivity extends Activity {
 
    private static SharedPreferences sPref;
    private static final String SAVED_TEXT = "scores";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.statistics);
        
        sPref = getPreferences(MODE_PRIVATE);
    }
    
    public static void saveScores(int score){
        Editor ed = sPref.edit();
        ed.putInt(SAVED_TEXT, score);
        ed.commit();
    }
    
    public static int loadScores(){
        int loadScores = sPref.getInt(SAVED_TEXT, 0);
        return loadScores;
    }
    
}
В другом классе я вызываю данные методы. Но приложение падает когда доходит до метода saveScores().
В чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 02:38     SharedPreferences
Посмотрите здесь:

SharedPreferences - Программирование Android
Всем привет, вопрос: Как через SharedPreferences сохранять "String текст", я многое перепробовал но вылет... Вылет... Не могли бы...

SharedPreferences - Программирование Android
выручайте, в чем ошибка? выводит 94 и 95, а должно 84 и 85 public class MainActivity extends Activity { Intent intent; ...

SharedPreferences - Программирование Android
как сохранить целое значение в SharedPreferences?

SharedPreferences - Программирование Android
Можно как-то сохранить SharedPreferences файл после перезагрузки девайса? P.S. как хранятся данные на девайсе в приложении Вк и ему...

SharedPreferences - Программирование Android
String PR = "key"; SharedPreferences mySharedPreferences = getSharedPreferences(PR, Activity.MODE_PRIVATE); String...

Array в SharedPreferences - Программирование Android
Добрый вечер! Вопрос заключается в том, можно ли сохранить настройки приложения с помощью SharededPreferences в виде массива? Нужно...

SharedPreferences, HashMap - Программирование Android
Хочу сделать Save , Load в sharedPreferences и вывести результат в Log. не вижу ошибки :wall: Спасибо. public class...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wenceslaus
Android Developer
130 / 130 / 4
Регистрация: 05.07.2013
Сообщений: 205
20.08.2013, 11:31     SharedPreferences #2
Flash_2oo9, проблема в том, что нельзя (точнее можно, но не нужно) делать запись в SharedPreferences Activity из другого класса. Это может делать только сам Activity. Если вам нужен доступ в к Preferences из разных классов, то используйте SharedPreferences приложения, а не отдельного Activity.
Java
1
SharedPreferences sharedPreferences = getSharedPreferences("Statistics", MODE_PRIVATE);
Это первое. Второе - зачем делать статические методы записи в Preferences, когда конструктор оного находится в нестатическом методе onCreate()? Не боитесь нарваться на NullPointerException?
Одним словом, хотите вынести всю работу с SharedPreferences в отдельный класс? Пожалуйста, только сделайте его статическим и никаких проблем не будет:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static class Statistics {
    
    private static final String PREFERENCES_NAME = "Statistics";
    private static final String SAVED_TEXT = "scores";
    
    public static void saveScores(Context context, int score){
        SharedPreferences sPref = context.getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
        Editor ed = sPref.edit();
        ed.putInt(SAVED_TEXT, score);
        ed.commit();
    }
    
    public static int loadScores(Context context){
        SharedPreferences sPref = context.getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
        int loadScores = sPref.getInt(SAVED_TEXT, 0);
        return loadScores;
    }
}
P.S. SharedPreferences - не база данных, а простой системный xml файл.
Flash_2oo9
3 / 3 / 0
Регистрация: 31.10.2012
Сообщений: 142
23.08.2013, 04:52  [ТС]     SharedPreferences #3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
 
public class SaveData { 
    
    public static void saveScores(Context contex, int score, String saved_text){
        SharedPreferences sPref =contex.getSharedPreferences(saved_text, Activity.MODE_PRIVATE);
        Editor ed = sPref.edit();
        ed.putInt(saved_text, score);
        ed.commit();
    }
    
    public static int loadScores(Context contex, String saved_text){
        SharedPreferences sPref = contex.getSharedPreferences(saved_text, Activity.MODE_PRIVATE);
        int loadScores = sPref.getInt(saved_text, 0);
        return loadScores;
    }   
}
Не получается прописать static class SaveData выбивает ошибку Illegal modifier for the class SaveData; only public, abstract & final are permitted.

Второй класс, который вызывает данные методы:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
 
public class StatisticsActivity extends Activity {
 
    int x = 10;
    int y = 0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.statistics);
        
        SaveData.saveScores(this, x, "best_score");
        y = SaveData.loadScores(this, "best_score");
        Toast.makeText(getApplicationContext(), y, Toast.LENGTH_SHORT).show();
        
    }   
}
Вот данные два класса компилируются без проблем, но при запуске программа аварийно завершается. В чем проблема?
Wenceslaus
Android Developer
130 / 130 / 4
Регистрация: 05.07.2013
Сообщений: 205
23.08.2013, 11:43     SharedPreferences #4
Flash_2oo9, если вы создаёте отдельный класс (файл) для SaveData, тогда правильно, объявление класса должно быть без модификатора static.
Теперь об ошибке, дайте угадаю NotFoundExeption?
Java
1
Toast.makeText(getApplicationContext(), String.valueOf(y), Toast.LENGTH_SHORT).show(); // второй параметр только String
И измените класс SaveData, PREFERENCES_NAME должен быть один на всё приложение, примерно так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SaveData {
    
    private static final String PREFERENCES_NAME = "myappnamescores";
 
    public static void saveScores(Context contex, int score, String saved_text){
        SharedPreferences sPref =contex.getSharedPreferences(PREFERENCES_NAME, Activity.MODE_PRIVATE);
        Editor ed = sPref.edit();
        ed.putInt(saved_text, score);
        ed.commit();
    }
    
    public static int loadScores(Context contex, String saved_text){
        SharedPreferences sPref = contex.getSharedPreferences(PREFERENCES_NAME, Activity.MODE_PRIVATE);
        int loadScores = sPref.getInt(saved_text, 0);
        return loadScores;
    }   
}
Flash_2oo9
3 / 3 / 0
Регистрация: 31.10.2012
Сообщений: 142
23.08.2013, 17:29  [ТС]     SharedPreferences #5
а разве PREFERENCES_NAME для каждого параметра не свой? То есть я хочу сохранить два разных числа мне нужно сохранить эти два числа с разными PREFERENCES_NAME, разве не так?
Проблема сохранилась, именно при вызове метода saveScores():
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
 
public class StatisticsActivity extends Activity {
 
    int x = 10;
    int y = 0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.statistics);
        
        SaveData.saveScores(this, x, "best_score");
        //y = SaveData.loadScores(this, "best_score");
        //Toast.makeText(getApplicationContext(), y, Toast.LENGTH_SHORT).show();
        
    }   
}
Здесь я закомментировал все вызовы методов оcтавил только saveScores(), но проблема осталась.
Все компилируется хорошо, но при запуске программа аварийно завершается. В чем проблема?
Wenceslaus
Android Developer
130 / 130 / 4
Регистрация: 05.07.2013
Сообщений: 205
23.08.2013, 18:13     SharedPreferences #6
Flash_2oo9, PREFERENCES_NAME один для всех параметров. По нему вы находите список пар ключ:значение. Вот именно ключ для разных значений (параметров, на вашем языке) разный.
Покажите лог. Полный лог с ошибками.. И изменённый класс SaveData, на всякий случай.
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
23.08.2013, 20:40     SharedPreferences #7
у меня вот так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Settings {
 
    private SharedPreferences sharedPref;
    public Settings(MainActivity activity) {
        sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
    }
    
    public int get(String string){
        return sharedPref.getInt(string, 0);
    }
    
    public void setConfig(String string, int value){
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(string, value);
        editor.commit();
    }
}
Activity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends Activity {
    
 
    private Settings settings;    
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        settings = new Settings(this);
        settings.setConfig("one", 12);
        settings.setConfig("two", 15);
 
         Log.v("parameter one", String.valueOf(settings.get("one")) );
         Log.v("parameter one", String.valueOf(settings.get("two")) );
 
    }
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2013, 03:22     SharedPreferences
Еще ссылки по теме:

Сохранение в SharedPreferences - Программирование Android
Вобщем, я хочу сделать так, чтобы при нажатии на кнопку создавалась на экране ещё одна кнопка(и так можно сделать неограниченное количество...

SharedPreferences сохранить на флешку - Программирование Android
Гуру, САБЖ! Есть ли СТАНДАРТНОЕ решение для подобного? Хочу сохранять настройки в папку на внешнюю "флешку" (ExternalStorage). ...

Записать объект в SharedPreferences - Программирование Android
Здравствуйте, всем. В приложении реализован свой класс сбора статистики. Есть ли какой-то простой способ сериализовать или...

SharedPreferences ArrayList<String> - Программирование Android
Можно ли массив целый сохранить именно методом SharedPreferences ?

Начальное значение SharedPreferences - Программирование Android
Здравствуйте. Как задать начальное значение в SharedPreferences, чтобы потом в методах обратного вызова не создавалось оно повторно? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
FullD
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 10
27.09.2013, 03:22     SharedPreferences #8
вобщем как то так . работает.
SettingsActivity вызывает/показывает SettingsView через setContentView

ну и не забыть сделать передаваемые данные из SettingsView public-ами

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class SettingsActivity extends Activity{
    
    SettingsView settingsview;
 
    public SharedPreferences prefs;
    public static final String APP_PREFERENCES = "myprefs";
    public static final String APP_PREFERENCES_STATUS = "booleaner"; 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
 
        prefs = getSharedPreferences(APP_PREFERENCES, 0);
        
        settingsview = new SettingsView(this);
        
        settingsview.statusprevmission = prefs.getBoolean(APP_PREFERENCES_STATUS, false);
        
        setContentView(settingsview);
        
    }
 
    @Override
    protected void onPause()
    {
        super.onPause();
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    @Override
    protected void onStop() {
        super.onStop();
 
        // Сохраняем статистику
        SharedPreferences.Editor editor = prefs.edit();
        
        editor.putBoolean(APP_PREFERENCES_STATUS, settingsview.booleaner);
 
        editor.commit();
    }
}
Yandex
Объявления
27.09.2013, 03:22     SharedPreferences
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru