Android拒绝编写/创建sharedpreferences文件

我正在使用
Eclipse 3.5.2 IDE进行
Android开发.我使用以下代码写入默认的sharedpreferences文件,我在adb模拟器中运行它:

private SharedPreferences getOurSharedPreferences(Activity act) {
    // return getSharedPreferences(SHARED_PREFS_FILENAME, MODE_PRIVATE);
    return act.getPreferences(MODE_PRIVATE);
}

private void putStringToStorage(Activity act, String keyName, String s) {

    // Store it.
    SharedPreferences sharedPrefs = getOurSharedPreferences(act);
    SharedPreferences.Editor editor = sharedPrefs.edit();
    editor.remove(keyName);
    // editor.putString(keyName, s);
    editor.putString(keyName, "test123");
    boolean bCommitted = editor.commit();
    if (!bCommitted) 
        throw new RuntimeException("(AndroidApplication) Unable to save new string.");

    // Get it back as a test.
    // String s2 = getStringFromStorage(keyName);
}

上面的方法属于我的一个Application子类,这就是为什么该方法带有一个Activity对象参数,所以我可以访问Activity.getPreferences().注意,之前我使用的是全局getSharedPreferences()调用,但由于我遇到的问题,我因绝望而改为getPreferences().我写“test123”而不是变量“s”的原因是为了确保我遇到的问题与“s”的某些值无关,这可能是共享首选项文件可能不喜欢的.

每当我运行代码editor.commit()总是返回FALSE.一些历史.前段时间我能够使用名为“app_global”的共享首选项文件写入共享首选项文件,该文件是使用全局getSharedPreferences()调用而不是Activity.getPreferences()创建的.我能够从该共享偏好文件中写入和读取值,但是,每当我重新启动我的应用程序时,我在上一个会话期间写的值都消失了.作为调试工作的一部分,我进入了adb shell并从我的应用程序的shared_prefs文件夹中删除了“app_global”.从那时起,模拟器似乎不愿意创建新的共享首选项文件,默认文件或其他文件.

请注意,LogCat窗口始终为空,并且控制台窗口不显示任何错误,包括在模拟器中启动应用程序期间.我还尝试在Debug模式下启动应用程序,并在Debug配置中选中“Wipe User Data”.这也无济于事.无论我做什么,在adb shell中执行“ls -a”时,editor.commit()失败并且我的应用程序的shared_prefs文件夹始终为空.

我的问题是:

>我通过某处了解了有关模拟器“重建用户图像”的内容.这是一种我可以用来尝试解决我在共享首选项存储中遇到的这类问题的技术吗?如果是这样,我该怎么做?
>还有什么我可以尝试解决这个问题吗?

– roschler

最佳答案 我设法通过手动重新创建sharedpreferences文件来解决问题.我无法确定这一点,但似乎如果您手动删除属于模拟器的共享首选项文件,即使您选择“擦除用户数据”选项,它也不会重新创建它.要手动重新创建sharedpreferences文件,我执行了以下操作:

>加载ADB shell
>更改为sharedpreferences文件夹(注意您必须运行模拟器,否则您将收到“未找到设备”错误,假设您没有连接手机)
>使用您在代码中使用的sharedpreferences文件的名称创建一个空文件.在我的例子中,我创建了一个名为“app_global”的文件.

您可以在此处找到sharedpreferences文件夹:

/data/data/your.app.package.name/shared_prefs

your.app.package.name是您的应用程序的包名称.要从ADB shell中创建空文件,我使用了以下命令:

echo -n >app_global

其中“app_global”是您为sharedpreferences文件命名的内容. -n选项可防止将换行符抛入文件中.如果您使用的是getPreferences(),那么默认的sharedpreferences文件的名称是“your.app.package.name_preferences.xml”.

我从这个StackOverflow帖子中获得了有关sharedpreferences文件夹的信息:

How to examine SharedPreferences from adb shell?

– roschler

点赞