SharedPreferences长整型数值

5

在这里,如果我没错的话,我正在创建一个SharedPreferences,我正在使用以下代码:

SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putLong("ExactTime", minutesToMilliseconds(NumberPicker2.getValue()));
editor.commit();

我正在做的是从NumberPicker获取value,我想保存这个value。即使用户重新启动应用程序或重新启动设备(我不知道SharedPreferences是否能实现...),当用户打开应用程序时,仍然选定了相同的数字。
我希望在扩展Service类的类中使用它。我尝试过以下代码:
SharedPreferences sp = this.getSharedPreferences("ExactTime", Context.MODE_PRIVATE);
WifiTimeSearch = sp.getLong("ExactTime", 0);

这里是我迷惑的地方...我读过这个“0”代表默认值,但我希望使用在SharedPreferences中存储的相同值...当我尝试使用这个Long值时,值为“0”。

我做错了什么?

3个回答

7
你正在读写不同的SharedPreference文件。
另外,通过使用getPreferences(),你正在写入到该Activity所属的本地SharedPreferences中。
从源代码来看:
/**
     * Retrieve a {@link SharedPreferences} object for accessing preferences
     * that are private to this activity.  This simply calls the underlying
     * {@link #getSharedPreferences(String, int)} method by passing in this activity's
     * class name as the preferences name.
     *
     * @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default
     *             operation, {@link #MODE_WORLD_READABLE} and
     *             {@link #MODE_WORLD_WRITEABLE} to control permissions.
     *
     * @return Returns the single SharedPreferences instance that can be used
     *         to retrieve and modify the preference values.
     */
    public SharedPreferences getPreferences(int mode) {
        return getSharedPreferences(getLocalClassName(), mode);
    }

为了使其正常工作,只需使用您的应用程序的默认SharedPreferences:
写入:
    SharedPreferences sp =  PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = sp.edit();
    editor.putLong("ExactTime", minutesToMilliseconds(NumberPicker2.getValue()));
    editor.commit();

阅读:

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    WifiTimeSearch = sp.getLong("ExactTime", 0);

请注意,只要您在 Activity 或 Service 中,就可以使用 this 作为上下文。这很重要。

1
非常好用,Daniel,非常感谢 :) 我缺少了PreferenceManager - Skizo-ozᴉʞS ツ

2
在SharedPreferences中,第一个参数是键(key),第二个参数是MODE。因此,要进行提交(COMMIT)和检索(retrieve)值,我们必须使用相同的键(key)。
尝试使用以下代码进行提交:
SharedPreferences sp = getSharedPreferences("ExactTime",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putLong("ExactTime", minutesToMilliseconds(NumberPicker2.getValue()));
editor.commit();

1
我猜问题出在你在读取偏好设置时将文件名传递为“ExactTime”,而在保存时没有指定任何内容。
请尝试这个。
SharedPreferences sp = getSharedPreferences(null,Context.MODE_PRIVATE);
WifiTimeSearch = sp.getLong("ExactTime", 0);

如果我没记错的话,getSharedPreferences()需要一个String和一个int... 请查看http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int)。 - Skizo-ozᴉʞS ツ
你可以将第一个参数传递为 null。 - Akhil
@Akhil 但是在检索值时,他使用的键是“ExactTime”,那么它能正常工作吗? - Anand Singh
同时,在编写时,您可以将 null 作为第一个参数传递。 - Akhil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接